首页 > 解决方案 > 在 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: (__, AuthStore authStore, _) {
      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(),
    );
  }
}

而且我知道这不应该是正确的方法,但是当商店发生变化时自动运行会持续触发

标签: flutterdartmobxflutter-provider

解决方案


在状态和有状态小部件下方的 void 方法中使用您想要重建的内容,而不是无状态小部件。


推荐阅读