在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方法中重建的内容,而不是无状态的小部件。