Flutter DropdownButton参数报错:无法将DropdownMenuItem赋值给List<DropdownMenuItem<String>>?
问题根因
你遇到的报错来自两个核心错误:
DropdownButton的items参数要求传入List<DropdownMenuItem<T>>类型的列表,你代码中直接传入了单个DropdownMenuItem对象,没有封装为数组结构- 未给
DropdownButton、DropdownMenuItem明确指定泛型,Dart自动推断类型为dynamic,与你传入的value值'Logout'的String类型不匹配,触发类型校验报错
修复步骤
- 给
DropdownButton显式指定泛型为String,匹配value参数的类型 - 将单个
DropdownMenuItem包裹到列表中,赋值给items参数 - 给
DropdownMenuItem指定泛型String,同时补充它的value属性为'Logout',和DropdownButton的value对应 - 补充
DropdownButton的onChanged回调,避免组件处于禁用状态 - 额外优化:Row布局内的间距组件应该设置
width而非height,水平间距才会生效
修复后核心代码
class _chatscreenState extends State<chatscreen> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Flutter Chat'), actions: [ DropdownButton<String>( items: [ DropdownMenuItem<String>( value: 'Logout', child: Row( children: [ Icon(Icons.exit_to_app,), SizedBox(width: 8,), Text('Logout') ], ), ) ], value: 'Logout', onChanged: (val) { // 此处添加选项选中后的处理逻辑,比如退出登录操作 }, ) ], ), body: StreamBuilder( stream: FirebaseFirestore.instance .collection('chats/EhXksd48J0ylTPpPb8ZM/messages') .snapshots(), builder: (ctx, AsyncSnapshot<QuerySnapshot>? snapshot) { if (snapshot!.connectionState == ConnectionState.waiting) { return Center( child: CircularProgressIndicator(), ); } if (!snapshot.hasData) { return Center(child: Text('Hey')); } final documents = snapshot.data!.docs; return ListView.builder( itemCount: documents.length, itemBuilder: (ctx, index) => Container( child: Text(documents[index]['Text']), padding: EdgeInsets.all(8), ), ); }, ), floatingActionButton: FloatingActionButton( child: Icon(Icons.add), onPressed: () { FirebaseFirestore.instance .collection('chats/EhXksd48J0ylTPpPb8ZM/messages') .add({'Text': 'Hey Again '}); }, ), ); } }
内容的提问来源于stack exchange,提问作者Nouman Khan
相关产品推荐
相关产品推荐

