如何解决在Mobx.dart存储区中进行更改后,不会重建窗口小部件
我想获得一些帮助。 我不明白为什么有些东西无法正确重建。 我有一个app.dart,它提供了所有商店,而Scafold的正文是主页,
class HomePage extends StatelessWidget {
const HomePage({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<AuthStore>(
builder: (__,AuthStore authStore,_) {
debugPrint('--- $authStore');
return SafeArea(
child: authStore.authenticated
? const AuthenticatedScreen()
: const LoginScreen(),);
},);
}
}
登录屏幕完成其工作,并正确更新商店,我不明白为什么将身份验证更改为true后主屏幕没有更新 我尝试添加具有相同结果的观察者,例如无需重建
class HomePageStateless extends StatelessWidget {
const HomePageStateless({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Consumer<AuthStore>(builder: (__,_) {
debugPrint('--- $authStore');
return Observer(
builder: (_) => SafeArea(
child: authStore.authenticated
? const AuthenticatedScreen()
: const LoginScreen(),),);
});
}
}
我在这里缺少什么 而此小部件可以按预期工作
class HomePage extends StatefulWidget {
const HomePage({
Key key,}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
AuthStore _authStore;
final List<Reactiondisposer> _disposers = <Reactiondisposer>[];
bool _authenticated = false;
@override
void didChangeDependencies() {
super.didChangeDependencies();
for (Reactiondisposer disposer in _disposers) {
disposer();
}
_disposers.clear();
_authStore ??= Provider.of<AuthStore>(context);
_disposers.add(
autorun(
(_) {
print('home store $_authStore');
if (_authenticated != _authStore.authenticated) {
setState(() {
_authenticated = _authStore.authenticated;
});
}
},);
}
@override
void dispose() {
for (Reactiondisposer disposer in _disposers) {
disposer();
}
super.dispose();
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: _authenticated ? const AuthenticatedScreen() : const LoginScreen(),);
}
}
我知道这不是正确的方法,但是当商店发生变化时,自动运行始终会触发
解决方法
使用您要在状态和有状态的小部件下方的void方法中重建的内容,而不是无状态的小部件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。