Flutter空安全迁移后遇Null转String类型错误求助
问题描述
我们完成Flutter项目的空安全迁移,执行dart pub outdated --mode=null-safety、dart pub get、手动迁移代码、dart migrate均成功,但运行flutter run时出现以下错误:
空安全错误 | 未处理的异常:类型 'Null' 不是类型 'String' 的子类型
相关代码如下:
数据库工具类中的方法
static Future<AppStrings> getAppText(String local) async { var appTextBox = await Hive.openBox("appTextBox"); AppStrings appText = new AppStrings( mainPageTitle: appTextBox.get('mainPageTitle'), timeText: appTextBox.get('timeText'), minutesText: appTextBox.get('minutesText'), mainPageSubtitle: appTextBox.get('mainPageSubtitle'), mainPageParagraph: appTextBox.get('mainPageParagraph'), mainPageButton: appTextBox.get('mainPageButton'), restartButton: appTextBox.get('restartButton'), backButton: appTextBox.get('backButton'), profileTitle: appTextBox.get('profileTitle'), loadingPageSubtitle: appTextBox.get('loadingPageSubtitle'), loadingPageBottomText: appTextBox.get('loadingPageBottomText'), loadingPageTitle: appTextBox.get('loadingPageTitle'), profileButton: appTextBox.get('profileButton'), resultRestart: appTextBox.get('resultRestart'), resultTitle: appTextBox.get('resultTitle'), resultSwipe: appTextBox.get('resultSwipe'), secondaryTitle: appTextBox.get('secondaryTitle'), tretiaryProductTitle: appTextBox.get('tertiaryTitle'), ); return appText; }
main.dart中的调用代码
AppStrings? appText = (await DatabaseUtils.getAppText(local ?? '')); return Data( allProfiles: allProfiles,........... )
问题原因
核心问题是:Hive的get()方法找不到对应key时会返回null,而AppStrings类的构造函数参数应为非空String类型(空安全迁移后默认要求)。当某个key不存在时,get()返回的null被赋值给非空参数,触发类型不匹配异常。
解决方案
提供三种可行思路,可根据业务需求选择:
方案1:给Hive的get方法设置默认值
调用get()时指定defaultValue,确保返回值永远是非空String:
AppStrings appText = new AppStrings( mainPageTitle: appTextBox.get('mainPageTitle', defaultValue: '默认标题'), timeText: appTextBox.get('timeText', defaultValue: '时间'), // 其他参数依次添加对应默认值 );
方案2:修改AppStrings类为可空参数
如果业务允许部分文本为空,将AppStrings的构造函数参数改为可空类型:
class AppStrings { final String? mainPageTitle; final String? timeText; // 其他参数同理改为String?类型 AppStrings({ this.mainPageTitle, this.timeText, // 其他参数 }); }
注意:后续使用这些字段时需处理null情况,比如用appText.mainPageTitle ?? '默认值'避免空指针。
方案3:预初始化Hive的所有必填key
在App启动时,预先将所有需要的key和对应文本存入Hive的box,确保get()永远能获取非空值:
// 示例:在初始化流程中执行 await appTextBox.putAll({ 'mainPageTitle': '首页标题', 'timeText': '时间', // 其他所有key对应的文本 });
内容的提问来源于stack exchange,提问作者Asha Chamy
相关产品推荐
相关产品推荐

