Flutter开发复选框遇报错:Text组件需传入非空字符串
解决Flutter中Text组件非空断言失败与复选框状态初始化问题
你目前遇到了两个关联的问题:一是Text组件因传入空值触发断言失败,二是复选框的状态列表未正确初始化(这是隐藏的后续问题),我来一步步帮你修复:
问题1:Text组件的非空断言失败
错误提示明确指出Text的data参数不能为null,这说明你的JSON数据中存在g_nama字段为空的条目,或者解析后对应的属性值为null。我们可以通过空值兜底来避免这个错误:
将原来的:
title: Text(snapshot.data[index].g_nama),
修改为:
title: Text(snapshot.data[index].g_nama ?? '无名称'),
这样当g_nama为null时,会显示"无名称"这个默认文本,彻底避免触发断言。
问题2:复选框状态列表未初始化
你的userStatus是一个空列表,但ListView.builder会尝试访问userStatus[index],这会直接导致索引越界错误(虽然你现在先遇到了Text的问题,但这个问题肯定会紧随其后)。我们需要在获取到异步数据后,初始化一个和数据长度一致的布尔值列表,默认全部为false:
在FutureBuilder的else分支里添加初始化逻辑:
else { // 确保状态列表长度与数据长度一致 if (userStatus.length != snapshot.data.length) { setState(() { userStatus = List<bool>.filled(snapshot.data.length, false); }); } return ListView.builder( // ... 原有代码 ); }
完整修复后的代码
import 'package:flutter/material.dart'; import 'dart:async'; import 'dart:convert'; import 'datagejala.dart'; class Diagnosis2 extends StatefulWidget { @override _Diagnosis2State createState() => _Diagnosis2State(); } class _Diagnosis2State extends State<Diagnosis2> { bool selected = false; var userStatus = List<bool>(); Future<List<DataGejala>> getContactsFromJSON(BuildContext context) async{ String jsonString = await DefaultAssetBundle.of(context).loadString("assets/data/penyakit.json"); List<dynamic> raw = jsonDecode(jsonString); return raw.map((f) => DataGejala.fromJSON(f)).toList(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Select City'), ), body: Container( child: FutureBuilder( future: getContactsFromJSON(context), builder: (BuildContext context, AsyncSnapshot snapshot) { print(snapshot.data); if (snapshot.data == null) { return Container(child: Center(child: Text("Loading..."))); } else { // 初始化复选框状态列表 if (userStatus.length != snapshot.data.length) { setState(() { userStatus = List<bool>.filled(snapshot.data.length, false); }); } return ListView.builder( itemCount: snapshot.data.length, itemBuilder: (BuildContext context, int index) { return ListTile( // 为Text添加空值兜底 title: Text(snapshot.data[index].g_nama ?? '无名称'), trailing: Checkbox( value: userStatus[index], onChanged: (bool val) { setState(() { userStatus[index] = val; }); } ), ); }, ); } }, ), ), ); } }
额外提示
- 建议你检查
penyakit.json文件,确认所有条目都包含g_nama字段,从根源上避免空值问题。 - 我把复选框
onChanged里的取反逻辑改成了直接使用传入的val,这样逻辑更直观,也符合复选框状态更新的常规写法。
内容的提问来源于stack exchange,提问作者dian
相关产品推荐
相关产品推荐

