You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:07:40