Flutter: триггеры RouteAware запускают только событие didPush

Привет, я новичок в флаттере, и хотя я уже искал эту тему, мне это непонятно. Итак, вот код:

файл main.dart

RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await DotEnv().load('.env');
  final UserRepository userRepository = new UserRepository();
  runApp(BlocProvider(
    create: (context) => AuthenticationBloc(userRepository)..add(AppStarted()),
    child: App(
      userRepository: userRepository
    ),
  ));
}

profile_form.dart (находится в другом файле и импортирует routeObserver из main.dart)

class ProfileForm extends StatefulWidget {
  final UserRepository _userRepository;
  final User _user;

  ProfileForm(
      {Key key, @required UserRepository userRepository, @required User user})
      : assert(userRepository != null && user != null),
        _userRepository = userRepository,
        _user = user,
        super(key: key);
  State<ProfileForm> createState() => _ProfileFormState();
}

class _ProfileFormState extends State<ProfileForm> with RouteAware {

  UserRepository get _userRepository => widget._userRepository;
  User get _user => widget._user;

  

  @override
  void initState() {
    super.initState();
  }

  @override
  void didChangeDependencies() {
    routeObserver.subscribe(this, ModalRoute.of(context));
    super.didChangeDependencies();
  }

  @override
  void didPush() {
    print('didPush FirstPage');
  }

  @override
  void didPopNext() {
    print('didPopNext FirstPage');
  }

  @override
  void didPop() {
    print('didPop FirstPage');
  }

  @override
  void didPushNext() {
    print('didPushNext FirstPage');
  }

  @override
  void dispose() {
    print("dis");
    routeObserver.unsubscribe(this);
    super.dispose();
  }
}

Эта форма вводится через Navigator.pushReplacementNamed(context, '/profile'); Хотя триггер события didPush() срабатывает, когда я возвращаюсь на другую страницу (снова из Nanigator или кнопки возврата) и ожидая срабатывания события didPop(), этого не происходит. Что мне здесь не хватает? Моя основная проблема заключается в том, что я хочу сохранить изменения, когда пользователь выходит из экрана профиля, но до входа в инициализацию другого экрана.

1 ответ

У меня была аналогичная проблема, поэтому, если это может кому-то помочь, вот что ее вызвало. Проблема заключалась в том, что тот, на который подписывался, отличался от того, который использовался.

Итак, проверка и didPopсобытия, но не было слушателей. Причина, по которой вы все еще получаете событие, заключается в том, что наблюдатель всегда отправляет didPush когда ты subscribe.

Основная причина в нашем случае заключалась в том, что мы использовали Provider предоставить RouteAware виджет, но каждый раз, когда он перестраивался, он получал новый, отличный от того, который был создан провайдером.

Проверьте, есть ли RouteObserver вы подписываетесь на тот же самый, который используется MaterialApp, с использованием hashCode свойство!

Другие вопросы по тегам