Flutter:从SQLite读取数据到DropdownMenu遇类型错误求助
报错_TypeError (type 'Future' is not a subtype of type 'List')的核心原因是:readData是异步函数,直接把它的返回值赋值给List<String> listA时,得到的是一个Future对象,而非实际的字符串列表。
以下是修正后的完整代码及关键改动说明:
关键改动点
- 初始化
listA为空列表,避免直接赋值Future对象 - 在
initState生命周期中调用异步函数获取数据,获取完成后通过setState更新列表 - 转换SQLite查询结果:
query返回的是List<Map>结构,需要提取其中的nom_A字段转为字符串列表 - 添加数据加载状态判断,避免列表为空时调用
listA.first报错
readData(table) async { var connection = await db; return await connection.query('SELECT nom_A FROM tab_A'); } class DropdownMenuA extends StatefulWidget { const DropdownMenuA({super.key}); @override State<DropdownMenuA> createState() => _DropdownMenuAState(); } class _DropdownMenuAState extends State<DropdownMenuA> { List<String> listA = []; String? selectedValue; @override void initState() { super.initState(); _loadData(); } // 异步加载数据并更新状态 _loadData() async { final data = await readData('tab_A'); // 转换查询结果为字符串列表 setState(() { listA = data.map((row) => row['nom_A'] as String).toList(); // 初始化选中值 if (listA.isNotEmpty) { selectedValue = listA.first; } }); } @override Widget build(BuildContext context) { // 数据未加载完成时显示占位组件 if (listA.isEmpty) { return const CircularProgressIndicator(); } return DropdownMenu<String>( initialSelection: selectedValue, onSelected: (String? value) { setState(() { selectedValue = value; }); }, dropdownMenuEntries: listA.map<DropdownMenuEntry<String>>((String value) { return DropdownMenuEntry<String>(value: value, label: value); }).toList(), ); } }
额外说明
- 确保
db是已正确初始化的SQLite数据库实例 - 如果
nom_A字段可能为null,需要添加空值判断(比如用row['nom_A']?.toString() ?? '') - 加载状态的占位组件可以根据需求替换为其他样式(比如文本提示)
内容的提问来源于stack exchange,提问作者Jef
相关产品推荐
相关产品推荐

