我从API获取一些数据,我想在DropdownButton中使用它。当我更改DropdownButton的值时,它在屏幕上不会更改。
我认为这是因为我将setState用作initState,但是我必须将FutureBuilder放入initState以避免多次加载数据。 我该如何解决?
final _formKey = GlobalKey<FormState>();
String _selItem;
FutureBuilder _FBDDB;
void initState() {
super.initState();
_FBDDB = FutureBuilder(
future: getdata(),
builder: (context, snapshot) {
if (snapshot.hasData) {
return DropdownButton<String>(
value: _selItem,
onChanged: (v) {
setState(() {
_selItem = v;
});
},
items: snapshot.data.items.map((item) {
return DropdownMenuItem<String>(
value: item.id, child: Text(item.name));
}).toList(),
);
} else if (snapshot.hasError) {
alertErr(context, snapshot.error.toString());
}
return Container(child: LinearProgressIndicator());
},
);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: Form(
key: _formKey,
child: Container(child: _FBDDB,),
),
);
}
答案 0 :(得分:1)
您的做法不正确,请查看此代码。
@override
final _formKey = GlobalKey<FormState>();
String _selItem;
FutureBuilder _FBDDB;
Future _future; // create this
void initState() {
super.initState();
// assign it here
_future = getData();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: Form(
key: _formKey,
child: Container(
child: FutureBuilder(
future: _future, // use it here
builder: (context, snapshot) {
if (snapshot.hasData) {
return DropdownButton<String>(
value: _selItem,
onChanged: (v) {
setState(() {
_selItem = v;
});
},
items: snapshot.data.items.map((item) {
return DropdownMenuItem<String>(
value: item.id, child: Text(item.name));
}).toList(),
);
} else if (snapshot.hasError) {
alertErr(context, snapshot.error.toString());
}
return Container(child: LinearProgressIndicator());
},
),
),
),
);
}
答案 1 :(得分:0)
您已将整个代码放入initState()中。您不必这样做。只需将更改后需要设置其值的变量以及所有其他代码置于initState()之外即可。