SQLite查询结果可正常打印但无法赋值给变量 报Null类型错误怎么解决
问题原因
你的代码核心问题出在 getPref 方法的异步返回逻辑上:
- 你在
dbClient.query的.then()回调中返回的list[0]只会作为.then()回调的返回值,不会作为整个getPref函数的返回值向外传递 getPref本身是异步函数,你没有显式声明返回值类型,也没有对外返回查询结果,默认会返回Future<Null>,所以你在调用处拿到的val天然是null,赋值给非空String类型的page就触发了类型错误- 你之前能正常打印查询结果,只是因为
.then()回调内部的逻辑正常执行了,结果没有被传递到函数外层而已
修复方案
第一步:重写 getPref 方法,统一使用 async/await 语法处理异步逻辑,显式返回查询结果
// 声明返回类型为Future<String?>,因为可能查询不到结果,返回可空字符串 Future<String?> getPref(Setting setting) async { var dbClient = await db; try { // 直接await查询结果,不需要嵌套then var data = await dbClient.query( 'settings', where: 'name = ?', whereArgs: [setting.name], columns: ['value'], ); List<String> list = []; for (var x in data) { x.forEach((k, v) => list.add(v.toString())); // 手动转String避免动态类型隐患 } // 先判断list是否为空,避免下标越界 if (list.isNotEmpty) { print("NAME: ${setting.name} VALUE: ${list[0]}"); return list[0]; } // 没有查询到结果返回null return null; } on Exception catch (ex) { print(ex.toString()); // 异常场景也返回null return null; } }
第二步:调整调用逻辑,处理可空返回值
String page = ""; getPage() async { DBHelper database = DBHelper(); String? val = await database.getPref(Setting(name: 'mainPage')); // 做空判断再赋值,避免类型错误 if (val != null) { setState(() { print("VAL $val"); page = val; }); } }
额外注意点
- 不要混用
async/await和.then()嵌套写法,很容易出现返回值传递遗漏的问题,统一用async/await逻辑更清晰 - 数据库查询结果可能为空,要提前做好空判断,避免后续逻辑异常
内容的提问来源于stack exchange,提问作者Chiliaz
相关产品推荐
相关产品推荐

