我有这个:
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();
}
型
工作非常好,但仅在模拟器。在我的手机不工作,因为下拉列表仍然禁用,因为里面没有项目。但在模拟器是工作正常。几秒钟后,下拉列表从禁用变为单独启用!!!
1条答案
按热度按时间wlsrxk511#
您应该将studentList变量移动到TestPageState类中。
然后在setState()块内的getJsonData方法中更新它。举例来说:
字符串
在setState调用中更新studentList将导致build()方法被再次调用,并且它将使用您分配给studentList的新值。