Flutter测验应用报错:Text Widget需传入非空String求助
解决Flutter测验应用中的'Text Widget必须传入非null字符串'报错
这个报错指向很明确:你的某个Text组件接收到了null值,违反了Flutter的非空断言。咱们从代码里的几个关键地方排查并修复:
1. 最直接的原因:访问JSON数据时可能返回null
你的quizpage里有两处Text直接依赖JSON数据的索引访问,一旦索引不存在或者数据结构不匹配,就会返回null:
- 题目文本:
Text(mydata[0][i.toString()]) - 选项文本:
Text(mydata[1][i.toString()][k])
修复方案:给Text添加非空默认值
用??运算符给可能为null的文本设置兜底内容:
// 题目文本修改 Text( mydata[0][i.toString()] ?? "题目加载失败", style: TextStyle( fontSize: 16.0, fontFamily: "Quando", ), ) // 选项文本修改 Text( mydata[1][i.toString()][k] ?? "选项加载失败", style: TextStyle( color: Colors.white, fontFamily: "Alike", fontSize: 16.0, ), maxLines: 1, )
2. FutureBuilder未正确处理加载/错误状态
在getjson的FutureBuilder中,你直接访问snapshot.data,但忽略了加载中和加载失败的状态,可能导致提前解析null数据:
修复方案:完善FutureBuilder的状态判断
builder: (context, snapshot) { // 加载中状态 if (snapshot.connectionState == ConnectionState.waiting) { return Scaffold( body: Center(child: Text("Loading")), ); } // 加载错误状态 if (snapshot.hasError) { return Scaffold( body: Center(child: Text("加载失败:${snapshot.error}")), ); } // 数据为空状态 if (snapshot.data == null) { return Scaffold( body: Center(child: Text("未获取到题目数据")), ); } // 正常解析数据 List mydata = json.decode(snapshot.data.toString()); return quizpage(mydata: mydata); }
3. 随机数生成可能超出JSON数据的实际范围
你的genrandomarray固定生成0-9的随机数,但如果你的JSON里题目数量不足10个,或者key不是连续的0-9,就会访问到不存在的索引,返回null:
修复方案:基于实际数据长度生成随机数
修改genrandomarray方法,让它根据题目数量生成有效索引:
genrandomarray(int totalQuestions) { var distinctIds = []; var rand = new Random(); int maxValidIndex = totalQuestions - 1; for (int i = 0;;) { distinctIds.add(rand.nextInt(maxValidIndex + 1)); random_array = distinctIds.toSet().toList(); // 最多取10题,或者取完所有题目 if (random_array.length < 10 && random_array.length <= totalQuestions) { continue; } else { break; } } print(random_array); }
然后在_quizpageState的initState里调用时传入实际题目数量:
@override void initState() { starttimer(); // 假设mydata[0]是存储题目的Map,长度就是题目总数 genrandomarray(mydata[0].length); super.initState(); }
4. 其他潜在问题修复
- 删掉
checkanswer方法里的无效代码:[i.toString()][k]);这行是误写,会导致语法错误 - 修正
quizpage的构造函数默认值:把widget.mydata = ""改为this.mydata(空字符串和List类型不匹配,可能引发类型错误) - 在
quizpage的build方法开头添加数据校验:
@override Widget build(BuildContext context) { if (mydata == null || mydata.length < 2) { return Scaffold( body: Center(child: Text("题目数据格式错误")), ); } // 原有build代码... }
内容的提问来源于stack exchange,提问作者Akash Kumar
相关产品推荐
相关产品推荐

