Flutter使用Provider绑定动态值的DropdownMenu运行报错如何解决
问题原因
- 类型不匹配:你当前Provider中存储的选中值
index是int类型,但每个DropdownMenuItem的value属性返回的是e.lecture(字符串类型),二者类型完全不一致 - 未明确指定泛型:
DropdownButton组件没有声明泛型,Dart类型推断失败,最终触发列表类型不匹配的报错
解决步骤
- 修正Provider的存储值类型,将选中值改为和item value一致的字符串类型:
class LecturesProvider with ChangeNotifier { // 若需要默认选中,初始值也可以设置为接口返回的第一个选项值 String? selectedLecture; void changeIndex(String? val) { selectedLecture = val; notifyListeners(); } }
- 给
DropdownButton明确指定泛型,绑定正确的选中值字段:
FutureBuilder( future: ApiService().getTeachersLectures(username, token), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { var lectures = snapshot.data; // 可选:如果需要默认选中第一个选项,加这行判断 if (Provider.of<LecturesProvider>(context, listen: false).selectedLecture == null && lectures.isNotEmpty) { Provider.of<LecturesProvider>(context, listen: false).changeIndex(lectures[0].lecture); } return Consumer<LecturesProvider>( builder: (context, lectureProvider, child) { // 明确指定泛型为String,和item的value类型匹配 return DropdownButton<String>( value: lectureProvider.selectedLecture, onChanged: (val) { lectureProvider.changeIndex(val); }, items: lectures.map<DropdownMenuItem<String>>((e) { return DropdownMenuItem<String>( value: e.lecture, child: Text('${e.lecture}')); }).toList()); }); } else { return const Text('not ok'); } }, )
内容的提问来源于stack exchange,提问作者Sermed mayi
相关产品推荐
相关产品推荐

