首页 > 解决方案 > 在构建用于空值的 Game-Null 检查运算符时抛出了以下 _CastError--Flutter

问题描述

我对共享偏好有疑问。如何使用共享首选项布尔值进行 IF else 操作?控制台向我展示:在构建游戏时引发了以下 _CastError(脏,依赖项:[_LocalizationsScope-[GlobalKey#0453f],_InheritedTheme],状态:_GameState#6a56a):空值检查运算符用于空值

我的代码:

    @override
  void initState() {
    super.initState();
 ...

    _sprache();
    _gesamtPkt();
  }
...

  @override
  void dispose() {
    super.dispose();
  }

  ///Loading counter value on start (load)
  _sprache() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _deutsch = (prefs.getBool('deutsch') ?? true);
      print(Text("Deutsch: $_deutsch"));
    });
  }
...

PageRouteBuilder(
                                    pageBuilder:
                                        // ignore: missing_return
                                        (context, animation1, animation2) {
                                      if (_deutsch = true) return Game();
                                      return GameEN();
                                    },

标签: androidflutterdartsharedpreferences

解决方案


它看起来不像导致该错误的行在代码片段中,但也许这会有所帮助:

在 Dart 中(启用了 null 安全性),有可为 null 和不可为 null 的变量:

String nonNullable = 'hello';  // OK
String nonNullable = null;  // compile time error

String? nullable = 'hello';  // OK
String? nullable = null;  // OK

nullable.length() // compile time error, `nullable` might be null

您不能对可空变量做很多事情,因为如果它为空,则在其上调用方法是错误的(经典的空引用错误)。

Dart 通常非常聪明,可以在安全的情况下自动在可空类型和不可空类型之间进行转换:

String? maybeNull = ...  // some maybe null string
if (maybeNull != null) {
  // compiler can prove that maybeNull is non-null here
  print(maybeNull.length());  // this is allowed
}

但是,有时作为程序员,您知道变量是非空的,但编译器无法证明这一点。在这些情况下,您使用!强制转换:

String? maybeNull = 'hello';
String notNull = maybeNull!;  // OK

String? maybeNull = null;
String uhOh = maybeNull!;  // runtime error: null-check operator used on null value

要解决您的问题,请转到错误指向的代码部分,并检查此空检查运算符的使用情况!。看起来它发生在一个小部件build方法中,所以检查它使用的值真的永远不会为空,或者处理它为空的情况(也许数据还没有加载?)。


推荐阅读