Flutter redux Navigator.pop () в StoreConnector после входа пользователя - PullRequest
0 голосов
/ 27 апреля 2020

Как я могу сделать Navigator.of(context).pop((route) => false); На моем экране входа в систему

class _LoginState extends State<Login> with SingleTickerProviderStateMixin {
  String email = '';
  String password = '';
  final Store<AppState> store;
  final _formKey = GlobalKey<FormState>();

  _LoginState(this.store);


  @override
  Widget build(BuildContext context) {
    return new StoreConnector<AppState, LoginViewModel>(
      converter: ((Store<AppState> store) => LoginViewModel.create(store)),
      builder: (BuildContext context, LoginViewModel viewModel)  {
        if(viewModel.user.email != '') {
           Navigator.of(context).pop((route) => false);
           return null;
        }
        return (
          viewModel.isLoading ? 
            Center(...)
            :
            Scaffold(...)

Это работает, но показывает ошибки.

Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4167:11)
I/flutter (13435): #1      Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4182:6)
I/flutter (13435): #2      State.setState (package:flutter/src/widgets/framework.dart:1253:14)
...

Я пишу здесь, потому что я даже не знаю, как Сформулируйте запрос в Google из-за того, что я компьютеризирован в флаттере (я имею дело с реагировать)

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

В идеале, вы не должны вызывать Navigator внутри дерева виджетов, поэтому вы получаете ошибку.

Для этого StoreConnector имеет onWillChange метод. Это функция, которая будет запускаться при изменении состояния до того, как будет создан виджет. (Аналогично componentWillUpdate в компонентах класса реакции)

class _LoginState extends State<Login> with SingleTickerProviderStateMixin {
  String email = '';
  String password = '';
  final Store<AppState> store;
  final _formKey = GlobalKey<FormState>();

  _LoginState(this.store);


  @override
  Widget build(BuildContext context) {
    return new StoreConnector<AppState, LoginViewModel>(
      converter: ((Store<AppState> store) => LoginViewModel.create(store)),
      onWillChange: (LoginViewModel prev, LoginViewModel viewModel) {
        if(viewModel.user.email != '') {
           Navigator.of(context).pop((route) => false);
           return null;
        }
      },
      builder: (BuildContext context, LoginViewModel viewModel)  {
        return (
          viewModel.isLoading ? 
            Center(...)
            :
            Scaffold(...)

Вы можете изучить другие методы, предоставляемые StoreConnector, в исходном коде. ( Github Link )

0 голосов
/ 27 апреля 2020

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

добавьте этот метод.

changenavigation() async {
    await Future.delayed(Duration(microseconds: 1));
       Navigator.of(context).pop((route) => false);
  }

измените условие следующим образом.

if(viewModel.user.email != '') {
      changenavigation();
       return Container();
    }
...