android - 在构建用于空值的 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();
},
解决方案
它看起来不像导致该错误的行在代码片段中,但也许这会有所帮助:
在 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
方法中,所以检查它使用的值真的永远不会为空,或者处理它为空的情况(也许数据还没有加载?)。
推荐阅读
- php - 我对文件夹名称中的空格有疑问
- r - 在应用退出时更改默认闪亮的灰色应用屏幕
- apache-spark - 将列表作为参数传递给 spark sql 语句
- r - R 脚本中的 ASCII 字符 - 尽管编码为 UTF-8,但文本输出会将它们转换为其他字符
- javascript - 从 MongoDB 获取数据并在 HTML 中仅显示一个参数
- ios - 如何在 Xcode Objective-c 中从 CNContacts 获取街道地址
- node.js - express.js api 路由器中哪种方法更优雅?
- java - android 应用程序未安装在版本 9 及更高版本中
- typescript - 多个文件夹的多个 tsconfig
- python - 悬停模板标签标题更改python