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

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

相关产品推荐
方舟 Agent Plan

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

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