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
свойство!