我在尝试类似的事情。在“未来生成器”中加载服务,设置文本字段值,然后编写组件。
final data = FutureBuilder(
future: DatameterService.getMapData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
setState(() {
calleController.text = snapshot.data.calle;
paisController.text = snapshot.data.pais;
provinciaController.text = snapshot.data.provincia;
poblacionController.text = snapshot.data.poblacion;
postalController.text = snapshot.data.postal;
});
return form;
} else {
return indicator;
}
但回报
在构建过程中调用
setState()或markNeedsBuild()。
因此,问题是:如何使用TextField填充FutureBuilder输入值?
发布于 2019-11-26 08:13:31
您不应该在构建中调用setState
,原因很简单: setState导致构建,构建调用setState --您处于无限循环中。这就是为什么引擎明确告诉您不应该尝试这样做的原因。
实际上,您不应该在构建中执行任何业务逻辑。从您的代码来看,您似乎希望在页面出现时加载一些数据,并为您的TextField
设置一些初始字段。我认为您不想在这里使用FutureBuilder
,因为您有一个StatefulWidget
。相反,您可以将未来移出构建,并在initState
中调用它。
就像这样:
class _MyState extends State<MyWidget> {
Map<String, dynamic> _data;
bool _loading;
TextEditingController _controller;
@override
void initState() {
super.initState();
// start fetching
_loading = true;
_data = {};
_controller = TextEditingController();
getData().then((data) {
setState(() {
_data = data;
_loading = false;
_controller.text = _data['text'];
});
});
}
Widget build(BuildContext context) {
// handle loading vs. not loading
if (_loading) return CircularProgressIndicator();
return Container(
// the rest of your code
);
}
}
您甚至不需要存储_data
,但是它对于重置表单或其他东西可能很有用。
发布于 2020-08-08 05:26:08
基本上,您需要理解FutureBuilder
以这种方式调用什么。FutureBuilder
有一个子future:
,您可以向其分配一个异步方法,该方法将.then
附加到该方法。'.then‘将在异步进程完成后被调用。
说到答案,你可以这样打电话给setState。
myFutureMethod.then((value) => {
setState(() {
value = true;
})
});
https://stackoverflow.com/questions/59054185
复制相似问题