#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. Я не понимаю эту фразу. Хотите продемонстрировать код?