flutter FutureBuilder在SetState之后导致DropDownButton出错

oxosxuxt  于 2023-08-07  发布在  Flutter
关注(0)|答案(1)|浏览(140)

我有这个:

List<Students> studentList= [];

Future<List<Students>> getJsonData() async {
   final String response = await rootBundle.loadString('assets/students.json');
   final data =  await json.decode(response);
   studentList= await data.map<Sudents>((json) => Sudents.fromJson(json)).toList();
   return studentList;
}

class TestPage extends StatefulWidget {
  const TestPage ({super.key});
  @override
  State<TestPage > createState() => TestPage State();
}
class TestPage State extends State<TestPage > {

  @override
  Widget build(BuildContext context) {
         return Scaffold(
           AppBar:...
           bottomNavigationBar:...
           body:FutureBuilder<List<Students>>(
              future: getJsonData() ,
              builder: (context, snapshot) {
                 switch (snapshot.connectionState) {
                     case ConnectionState.waiting:
                        return const Center(child: Text("waiting"),);
                     default:
                        if(snapshot.hasError == false){
                             return BuildPage();                             
                        }
                 }
           )
         )
  }

字符串
在BuildaPage中,我有一个下拉列表。当我在下拉列表中选择一个元素时,我调用setState()来更新。我需要调用setState,因为当我选择一个项目时,我需要设置一个控制器的文本字段。
问题来了。首先,我收到一个红页错误,说或是空或重复的项目在这个下拉列表。
"应该只有一个项目具有[DropdownButton]的值:“模型”的示例。检测到0个或2个或更多个[DropdownMenuItem]具有相同值"
第二步是再次调用getJsonData()。我不需要更新这个json,我只需要阅读。
我使用FutureBuilder仅在读取所有数据后才开始绘制下拉列表。
也许我有重复的项目,因为我再次调用getJsonData()?
因为空,我猜没有,因为项目是在下拉列表中列出的。只有当我选择一个项目时,才会出现问题。
感谢您的支持。
我试过没有FutureBuilder,但问题是,我读的是一个空列表,因为json没有及时准备好,当下拉列表正在读取列表。
编辑1:一个人认为解决,但我认为这是不正确的,我创建了一个bool started = false;在getJsonData()中,我放了一个if/else。所以,如果开始等于真,我不会再读json。我只返回相同的列表...但问题是,如果我决定创建一个动态列表,需要再次阅读列表,所以我会得到错误!
第2章:另一个测试在getJsonData()中,我删除了if/else,并在bagging中添加modelsListLoaded.clear();但没有奏效。同样的错误。我试图清除列表之前,但发生了同样的错误。
EDIT3:如果我删除所有FutureBuilder的东西并使用以下代码:

@override
void initState() {
    // TODO: implement initState
     getJsonData();
    super.initState();
  }


工作非常好,但仅在模拟器。在我的手机不工作,因为下拉列表仍然禁用,因为里面没有项目。但在模拟器是工作正常。几秒钟后,下拉列表从禁用变为单独启用!!!

wlsrxk51

wlsrxk511#

您应该将studentList变量移动到TestPageState类中。
然后在setState()块内的getJsonData方法中更新它。举例来说:

void getJsonData() async {
    final String response = await rootBundle.loadString('assets/students.json');
    final data = await json.decode(response);
    final newStudentList = await data.map<Students>((json) => Students.fromJson(json)).toList();
    setState( () {
      studentList = newStudentList ;
    });
  }

字符串
在setState调用中更新studentList将导致build()方法被再次调用,并且它将使用您分配给studentList的新值。

相关问题