Flutter中ListView填充动态数据无显示问题排查求助
问题原因
- 你在
build方法中生成的100条模拟数据只保存在局部变量items里,但ListView.builder的itemCount绑定的是全局空列表vehicles的长度,初始时vehicles没有元素,长度为0,所以不会渲染任何列表项 - 代码中同时混用了两个数据源:
ExpansionTile的标题读取自vehicles[i],展开内容又读取自items[i],逻辑存在冲突
修复方法
推荐直接使用局部生成的items作为唯一数据源,修改对应参数即可,修复后的完整代码如下:
import 'package:flutter/material.dart'; void main() => runApp(MaterialApp( home: MyApp(), debugShowCheckedModeBanner: false, )); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { final items = List<Vehicle>.generate(100, (i) => i % 6 == 0 ? Vehicle('qqq', ['111', '222']) : Vehicle('sss', ['333', '444'])); return Scaffold( body: ListView.builder( // 替换为items的长度 itemCount: items.length, itemBuilder: (context, i) { return ExpansionTile( // 替换为从items取数据 title: Text( items[i].title, style: TextStyle( fontSize: 20.0, fontWeight: FontWeight.bold, fontStyle: FontStyle.italic), ), children: <Widget>[ Column( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end, children: _buildExpandableContent(items[i])), ], ); }, ), ); } _buildExpandableContent(Vehicle vehicle) { List<Widget> columnContent = []; for (String content in vehicle.contents) { columnContent.add( ListTile( title: Text( content, style: TextStyle(fontSize: 18.0), ), ), ); } return columnContent; } } class Vehicle { final String title; List<String> contents = []; Vehicle(this.title, this.contents); }
额外优化建议
如果后续需要对列表做增删改操作,建议把items变量移到_MyAppState类的成员位置,不要放在build方法内,避免页面每次重绘都重复生成列表数据。原代码中全局定义的空vehicles列表没有用到,可以直接删除。
内容的提问来源于stack exchange,提问作者Aquarius_Girl
相关产品推荐
相关产品推荐

