Exception 调用setState()或markNeedsBuild()>;当小部件树被锁定时。改变状态时
请看我的代码:Exception 调用setState()或markNeedsBuild()>;当小部件树被锁定时。改变状态时,exception,dart,flutter,state,Exception,Dart,Flutter,State,请看我的代码: class HomePageState extends State<HomePage> { bool _isLoading = false; ..... @override Widget build(BuildContext context) { var drawerOptions = <Widget>[]; ...... drawerOptions.add(new ListTile( leadi
class HomePageState extends State<HomePage> {
bool _isLoading = false;
.....
@override
Widget build(BuildContext context) {
var drawerOptions = <Widget>[];
......
drawerOptions.add(new ListTile(
leading: new Icon(Icons.account_balance),
title: new Text(Strings.menu_change_city),
onTap: () => createDialog()
));
if(_isLoading) return buildBusyForm();
return Scaffold( .... //window content
}
}
类HomePageState扩展状态{
bool_isLoading=false;
.....
@凌驾
小部件构建(构建上下文){
var Droproptions=[];
......
添加(新的ListTile)(
前导:新图标(图标。账户余额),
标题:新文本(字符串、菜单、更改、城市),
onTap:()=>createDialog()
));
如果(_isLoading)返回buildBusyForm();
返回脚手架(..//窗口内容)
}
}
所以我有了导航抽屉。一个项目(“选择城市”)没有关闭导航抽屉,它显示选择城市对话框:
createDialog() {
setState(() {_isLoading = true;});
fetchCities().then((response) {
setState(() {_isLoading = false;});
showDialog(
context: context,
builder: (context) => CityChoiceDialog<City>(
title: Text(Strings.menu_change_city),
items: response,
initialValue: response.firstWhere((c) => c.id == globals.cityId, orElse: () => new City()),
itemBuilder: (City city) => Text(city.name),
onSelected: _onSelected,
onSubmitted: _onSubmitted));
});
}
createDialog(){
setState((){u isLoading=true;});
fetchCities()。然后((响应){
setState((){u isLoading=false;});
显示对话框(
上下文:上下文,
生成器:(上下文)=>CityChoiceDialog(
标题:文本(字符串、菜单、更改、城市),
项目:答复,
initialValue:response.firstWhere((c)=>c.id==globals.cityId,或lse:()=>new City()),
itemBuilder:(城市)=>文本(City.name),
当选:_onSelected,
未提交的:未提交的);
});
}
所以,基本上,它的目的是显示繁忙的表单,加载城市,然后隐藏繁忙的表单和显示城市列表对话框。由于它似乎起作用,我得到了一个例外:
I/颤振(10662):══╡ WIDGETS库捕获到异常
╞═══════════════════════════════════════════════════════════ I/颤振
(10662):在完成
小部件树:I/flatter(10662):调用setState()或markNeedsBuild()
当小部件树被锁定时。I/flatter(10662):这个
_无法将ModalScope小部件标记为需要构建,因为框架为I/颤振(10662):锁定。I/颤振(10662):
调用setState()或markNeedsBuild()的小部件是:
I/颤振(10662):_ModalScope-[LabeledGlobalKey#1f222](状态: I/颤振(10662):_模态镜状态#6c40b)
如何正确执行我想要的操作?此错误意味着您正在生成阶段调用setState,您无法执行此操作。如何关闭抽屉?我注意到,如果我在尝试更改状态之前关闭抽屉,问题可以解决。如果抽屉仍然打开,并且我想要更改状态,我会遇到此异常。这种类型的只有在调试器中才会注意到异常,但当您在实际设备上运行此应用程序时,它不会产生任何明显的效果。我尝试过。可能与此相关: