Виджет не перестраивается после изменения в хранилище Mobx.dart

#flutter #dart #mobx #flutter-provider

#flutter #dart #mobx #flutter-поставщик

Вопрос:

Я хотел бы получить некоторую помощь. Я не понимаю, почему что-то не перестраивается должным образом. У меня есть app.dart, который предоставляет все хранилища, а тело папки — домашняя страница,

 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(),
    );
  }
}
  

И я знаю, что это не должно быть правильным способом, но автозапуск срабатывает постоянно при изменении хранилища

Комментарии:

1. Подсказка: вы используете виджет без состояния в сценарии «не работает» и используете stateful виджет в working сценарии.

2. Это не помогает.

Ответ №1:

Используйте то, что вы хотите перестроить, в методе void под виджетом state и statefull вместо виджета без состояния.

Комментарии:

1. Я не понимаю эту фразу. Хотите продемонстрировать код?