为啥 Theme.of(context) 告诉我在取消引用之前检查该值是不是为“null”?

Posted

技术标签:

【中文标题】为啥 Theme.of(context) 告诉我在取消引用之前检查该值是不是为“null”?【英文标题】:Why Theme.of(context) telling me to check that the value isn't 'null' before dereferencing it?为什么 Theme.of(context) 告诉我在取消引用之前检查该值是否为“null”? 【发布时间】:2021-10-12 01:03:40 【问题描述】:

我在 MaterialApp 中为我的应用设置了自定义主题。当我尝试使用以下语法时,它显示错误。可能是什么原因?

colors: [
              Theme.of(context).primaryColor,
              Theme.of(context).accentColor
            ],

这是我的 ThemeDataMaterialApp 构造函数。

    class MyApp extends StatelessWidget 

  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      debugShowCheckedModeBanner: false,
        title: 'Medbo',
        theme: ThemeData(
          primaryColor: AppColor.colorPrimary1,
          accentColor: AppColor.colorPrimary2,
        ),
        // home: Home(),
        initialRoute: '/',
        routes:
          '/': (_)=>Home(),

        
    );

当我尝试在我的 Scaffold 中使用它时 ->

    return Scaffold(
  appBar: AppBar(
      flexibleSpace: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            begin: Alignment.topLeft,
            end: Alignment.topRight,
            colors: [
              Theme.of(context).primaryColor,     // error showing here
              Theme.of(context).accentColor      // error showing here
            ],
          ),
        ),
      ),

在这里我设置了我的颜色属性 ->

import 'package:flutter/material.dart';
class AppColor
  static final Color colorPrimary1 = Color.fromRGBO(30,81,126,1.0);
  static final Color colorPrimary2 = Color.fromRGBO(28, 117, 149, 1.0);

【问题讨论】:

我想查看你的 AppColor 课程。 嘿,刚刚添加了 AppColor 类 谢谢。你迁移到 nullSafety 了吗? 您在上面显示的代码对我来说运行良好,但您在屏幕截图中显示的内容不同。我建议使用 nullSafety 运算符!或?。 问题出在他的 Flutter 上。重新安装 Flutter 后。一切正常。 【参考方案1】:

由于 dart 的新更新,您应该使用 null 安全性。这意味着你必须要么放!要么 ?在变量前面知道它可能为空,或者你应该在使用它之前先初始化它,以避免它以后可能导致的进一步错误。有关更多信息,您可以阅读 dart 的 null-safety 官方文档here。

【讨论】:

以上是关于为啥 Theme.of(context) 告诉我在取消引用之前检查该值是不是为“null”?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 分配 Theme 文本样式

如何在 Flutter 中更改整个主题的文本颜色?

为啥 SignalR Context.User.Identity.Name 为空?

为啥使用 Activity 上下文会导致 Context 内存泄漏

每当我在任何按钮(即 UISegmentedControl 按钮)之外单击时,都会单击该按钮。谁能告诉我为啥会这样?

为啥 Context API 在高频更新方面比 Redux 差?