Flutter中如何获取类内函数数据传入列表、解决ListView.builder空报错问题
问题根因梳理
你的代码存在多处语法、结构逻辑错误,是空报错的核心原因:
- 类定义不符合调用逻辑:
Child类构造函数定义为位置参数,实际调用时传入了命名参数,会直接报错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
相关产品推荐
相关产品推荐

