[英]Screen Flickers when Updating Widget at Top Level
我将整个应用程序包装在一个 StateContainer 中,以便我可以从应用程序中的任何位置读取和写入某些变量。
main.dart
void main() {
return runApp(new StateContainer(child: new MyApp()));
}
状态容器:
class StateContainer extends StatefulWidget {
final Widget child;
final User user;
StateContainer({
@required this.child,
this.user,
});
static StateContainerState of(BuildContext context) {
return (context.dependOnInheritedWidgetOfExactType<UserData>()).data;
}
@override
StateContainerState createState() => new StateContainerState();
}
class StateContainerState extends State<StateContainer> {
User user;
void updateUUID({uuid}) {
if (user == null) {
user = new User(uuid);
setState(() {
user = user;
});
} else {
setState(() {
user.uuid = uuid ?? user.uuid;
});
}
}
@override
Widget build(BuildContext context) {
return new UserID(
data: this,
child: widget.child,
);
}
}
class User {
String uuid;
User(this.uuid);
}
class UserData extends InheritedWidget {
final StateContainerState data;
UserData({
Key key,
Widget child,
@required this.data,
}) : super(
key: key,
child: child,
);
@override
bool updateShouldNotify(InheritedWidget oldWidget) {
return true;
}
}
当我从孩子的 build 方法调用 updateUUID 时,我对为什么屏幕闪烁感到困惑,如下所示:
final container = StateContainer.of(context);
container.updateUUID('1234');
但是,我可以从 StateContainer 读取而不会导致闪烁,如下所示:
var uuid = container.user.uuid;
有没有办法可以防止这个屏幕闪烁,同时仍然能够从任何地方读/写变量?
我找到了使用 Provider(ChangeNotifierProvider 和 Consumer)的替代解决方案,如下所述: https://flutter.dev/docs/development/data-and-backend/state-mgmt/simple
这可以防止屏幕闪烁。
如果您看到类似的错误
错误:在此消费者小部件上方找不到正确的提供者
尝试在小部件树中将 Provider / ChangeNotifierProvider 移到更高的位置。 我不得不将我的移动到最顶部以防止此错误,即使它似乎已经在使用它的小部件之上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.