之所以出现该异常,是因为您正在从其后代同步修改窗口小部件。
这很不好,因为它可能导致小部件树不一致。一些小部件。可能会使用突变前的值来构建窗口小部件,而其他窗口可能会使用突变后的值。
解决的办法是消除不一致之处。使用
ChangeNotifierProvider,通常有两种情况:
- 对您执行的变异
ChangeNotifier
总是与创建您的变异在同一 构建中 完成ChangeNotifier
。
在这种情况下,您可以直接从您的构造函数中进行调用
ChangeNotifier:
class MyNotifier with ChangeNotifier { MyNotifier() { // TODO: start some request }}- 所执行的更改可以“延迟”发生(通常在更改页面之后)。
在这种情况下,您应该将突变包装在
addPostframeCallback或中
Future.microtask:
class Example extends StatefulWidget { @override _ExampleState createState() => _ExampleState();}class _ExampleState extends State<Example> { MyNotifier notifier; @override void didChangeDependencies() { super.didChangeDependencies(); final notifier = Provider.of<MyNotifier>(context); if (this.notifier != notifier) { this.notifier = notifier; Future.microtask(() => notifier.doSomeHttpCall()); } } @override Widget build(BuildContext context) { return Container(); }}


