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

Flutter中如何获取类内函数数据传入列表、解决ListView.builder空报错问题

问题根因梳理

你的代码存在多处语法、结构逻辑错误,是空报错的核心原因:

  • 类定义不符合调用逻辑:
    1. Child类构造函数定义为位置参数,实际调用时传入了命名参数,会直接报错
    2. Parent类的childClass初始化错误,当前赋值的是[Child](存储的是Child类型本身,不是Child实例的空列表),且未指定泛型,后续取值会出现类型异常
  • Model层数据作用域错误:
    Data类中的pc是MyList方法内的局部变量,没有声明为Data的类属性,外部无法通过data.pc访问到该列表,自然取到空值
  • ListView取值逻辑错误:
    pc是Parent类型的列表,不能直接调用pc.childClass,需要先取出对应下标位的Parent实例,再访问其childClass列表,同时取值时也需要指定childClass的下标位
  • 基础布局语法错误:
    Scaffold组件直接传入ListView,缺少必填的body参数声明,会触发布局异常
修复后代码

1. 修正类定义

class Parent {
  late String? pContent;
  // 修正为Child类型的空列表,指定泛型
  List<Child> childClass = [];
  Parent(this.pContent);
}

class Child {
  late int? id;
  late String? cContent;
  // 修正为命名参数匹配后续调用逻辑
  Child({required this.id, required this.cContent});
}

2. 修正Model层定义

class Data {
  // 把pc声明为类的公共属性,外部可访问
  late List<Parent> pc;
  Data() {
    pc = [];
    pc.add(Parent('abc'));
    pc[0].childClass.add(Child(id: 1, cContent: 'This is child class content 1'));

    pc.add(Parent('xyz'));
    pc[1].childClass.add(Child(id: 2, cContent: 'This is child class content 2'));
  }
}

3. 修正ListView实现

提供两种常见实现场景,可按需选择:

场景1:平铺展示所有Parent下的所有Child

class _MyScreenState extends State<MyScreen> {
  // 提前汇总所有child实例,简化渲染逻辑
  late List<Child> allChildren;
  var data = Data();

  @override
  void initState() {
    super.initState();
    allChildren = data.pc.expand((parent) => parent.childClass).toList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      // 补全body参数
      body: ListView.builder(
        itemCount: allChildren.length,
        itemBuilder: (context, i) {
          return Container(
            // 加??'' 空值兜底,避免空安全异常
            child: Text(allChildren[i].cContent ?? ''),
          );
        },
      ),
    );
  }
}

场景2:嵌套展示,先显示Parent内容,再显示其下所有Child内容

class _MyScreenState extends State<MyScreen> {
  var data = Data();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: data.pc.length,
        itemBuilder: (context, parentIndex) {
          final parent = data.pc[parentIndex];
          return Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              // 展示Parent内容
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text(parent.pContent ?? '', style: const TextStyle(fontWeight: FontWeight.bold)),
              ),
              // 展示该Parent下的所有Child内容
              ...List.generate(parent.childClass.length, (childIndex) {
                final child = parent.childClass[childIndex];
                return Padding(
                  padding: const EdgeInsets.only(left: 16, top: 4, bottom: 4),
                  child: Text(child.cContent ?? ''),
                );
              })
            ],
          );
        },
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者jobid58525

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:15:04