Flutter BlocListener не срабатывает при переходе на следующую страницу ⇐ Android
-
Anonymous
Flutter BlocListener не срабатывает при переходе на следующую страницу
Когда я перехожу на тестовую страницу со страницы createNewTrip, блок-прослушиватель на тестовой странице не запускается. функция createTrip отправляет событие temporallyStrorTrip в tripBloc. тогда блок-прослушиватель на странице createNewTrip будет активирован и перейдет на тестовую страницу, но блок-прослушиватель на тестовой странице не будет запущен. спасибо
это страница createNewTrip
класс createNewTrip расширяет StatefulWidget { конечная строка PlaceName; конечная строка PlacePhotoUrl; окончательный isEditTrip; const createNewTrip({super.key, требуется this.placeName, требуется this.placePhotoUrl, требуется this.isEditTrip }) ; @переопределить State createState() => _createNewTripState(placeName,placePhotoUrl,isEditTrip); } class _createNewTripState расширяет State { вар isDataReady = ложь; конечная строка PlaceName; окончательный логический isEditTrip; поздний финал String backGroundPlacePhotoUrl; поздняя строка defaultBacPhotoUrl; поздний финал String planTrips = '5'; late String tripName =''; вар днейПродолжительность; вар EndDate; TextEditingController dateinput = TextEditingController(); окончательный TripNameController = TextEditingController(); окончательный TripBudgetController = TextEditingController(); окончательный TripLocationController = TextEditingController(); окончательный TripDescriptionController = TextEditingController(); _createNewTripState(this.placeName,this.backGroundPlacePhotoUrl,this.isEditTrip); @переопределить недействительный initState() { супер.initState(); получитьBackGroundImage (); } @переопределить недействительный распоряжаться () { супер.dispose(); TripNameController.dispose(); TripBudgetController.dispose(); TripLocationController.dispose(); TripDescriptionController.dispose(); } Будущее createTrip ()async{ if(isEditTrip != true){ вар длительностьCount = днейДлительность??0; вар conDurationCount = длительностьCount.toString(); context.read().add( временноStoreTripEvent( ИмяПоездкиController.text, конDurationCount, датаввод.текст, TripBudgetController.text, TripLocationController.текст, TripDescriptionController.text, defaultBacPhotoUrl.isNotEmpty?defultBacPhotoUrl:backGroundPlacePhotoUrl, endDate.toIso8601String() ) ); } @переопределить Сборка виджета (контекст BuildContext) { вернуть WillPopScope( onWillPop: () асинхронный { Navigator.pop(контекст); вернуть истину; }, дочерний элемент: GestureDetector( onTap: () { setState(() { Имя поездки; }); FocusScope.of(context).unfocus(); }, дочерний элемент: MultiBlocListener( слушатели: [ BlocListener( прослушиватель: (контекст, состояние) async { если (состояние временноStoreTripState) { Навигатор.push( контекст, MaterialPageRoute (строитель: (контекст) { возвращаться БлокПровидер.значение( значение: BlocProvider.of(контекст), дочерний элемент: const test(), ); } ), ); } } ) ], ребенок: Эшафот() Это тестовая страница
тест класса расширяет StatefulWidget { const test({super.key}); @переопределить State createState() => _testState(); } класс _testState расширяет State { @переопределить недействительный initState() { супер.initState(); } @переопределить Сборка виджета (контекст BuildContext) { вернуть MultiBlocListener( слушатели: [ BlocListener( слушатель: (контекст, состояние) { печать("триггер"); } ) ], дочерний элемент: эшафот()); } } это main.dart
void main() async{ ВиджетыFlutterBinding.ensureInitialized(); дождитесь Firebase.initializeApp(); ждут dotenv.load(имя_файла: '.env'); проверитьLoggedIn(); } класс MyApp расширяет StatelessWidget { конечная строка InitialRoute; const MyApp({required this.initialRoute, Key? key}) : super(key: key); @переопределить Сборка виджета (контекст BuildContext) { вернуть MultiBlocProvider( провайдеры: [ BlocProvider(create: (контекст BuildContext) => PlaceListBloc()), BlocProvider(create: (контекст BuildContext) => userBloc()), BlocProvider(create: (контекст BuildContext) => tripBloc()) ],child:MaterialApp( debugShowCheckedModeBanner: ложь, начальныйRoute: начальныйRoute, маршруты: { '/login': (контекст) => const WelcomePage(), '/home': (контекст) => NavigationPage(isBackButtonClick:false,autoSelectedIndex: 0,), '/emailVerification': (контекст) => const emailVerificationPage(), }, ), ); } } это tripBloc
class tripBloc расширяет Bloc { Future getOnGoingTrips() async { Список trips = await tripRepo.onGoingTrips(); обратные поездки; } Future PastTrips() async { Список поездок =await tripRepo.pastTrips(); обратные поездки; } Future countTotalTrips() async { int count = ждут tripRepo.countTotalTrips(); счетчик возврата; } Future getRandomImage(tripCount) async { Строковое изображение = ожидание randomImagesRep.getRandomImage(tripCount); вернуть изображение; } tripBloc():супер(InitialTripState()){ on((событие, выброс) async { если (событие временноStoreTripEvent) { вар uuid = const Uuid(); последняя поездка trip=Путешествие( идентификатор поездки: uuid.v1(), tripName: event.tripName, длительностьCount: event.durationCount, КонечнаяДата: event.endDate, tripCoverPhoto: event.tripCoverPhot, tripBudget: event.tripBudget, tripDescription: event.tripDescription, tripDuration: event.tripDuration, tripLocation: event.tripLocation, места: [], ); испускать (временноStoreTripState (поездка)); } иначе, если Я пробую это решение, но оно у меня не работает
Когда я перехожу на тестовую страницу со страницы createNewTrip, блок-прослушиватель на тестовой странице не запускается. функция createTrip отправляет событие temporallyStrorTrip в tripBloc. тогда блок-прослушиватель на странице createNewTrip будет активирован и перейдет на тестовую страницу, но блок-прослушиватель на тестовой странице не будет запущен. спасибо
это страница createNewTrip
класс createNewTrip расширяет StatefulWidget { конечная строка PlaceName; конечная строка PlacePhotoUrl; окончательный isEditTrip; const createNewTrip({super.key, требуется this.placeName, требуется this.placePhotoUrl, требуется this.isEditTrip }) ; @переопределить State createState() => _createNewTripState(placeName,placePhotoUrl,isEditTrip); } class _createNewTripState расширяет State { вар isDataReady = ложь; конечная строка PlaceName; окончательный логический isEditTrip; поздний финал String backGroundPlacePhotoUrl; поздняя строка defaultBacPhotoUrl; поздний финал String planTrips = '5'; late String tripName =''; вар днейПродолжительность; вар EndDate; TextEditingController dateinput = TextEditingController(); окончательный TripNameController = TextEditingController(); окончательный TripBudgetController = TextEditingController(); окончательный TripLocationController = TextEditingController(); окончательный TripDescriptionController = TextEditingController(); _createNewTripState(this.placeName,this.backGroundPlacePhotoUrl,this.isEditTrip); @переопределить недействительный initState() { супер.initState(); получитьBackGroundImage (); } @переопределить недействительный распоряжаться () { супер.dispose(); TripNameController.dispose(); TripBudgetController.dispose(); TripLocationController.dispose(); TripDescriptionController.dispose(); } Будущее createTrip ()async{ if(isEditTrip != true){ вар длительностьCount = днейДлительность??0; вар conDurationCount = длительностьCount.toString(); context.read().add( временноStoreTripEvent( ИмяПоездкиController.text, конDurationCount, датаввод.текст, TripBudgetController.text, TripLocationController.текст, TripDescriptionController.text, defaultBacPhotoUrl.isNotEmpty?defultBacPhotoUrl:backGroundPlacePhotoUrl, endDate.toIso8601String() ) ); } @переопределить Сборка виджета (контекст BuildContext) { вернуть WillPopScope( onWillPop: () асинхронный { Navigator.pop(контекст); вернуть истину; }, дочерний элемент: GestureDetector( onTap: () { setState(() { Имя поездки; }); FocusScope.of(context).unfocus(); }, дочерний элемент: MultiBlocListener( слушатели: [ BlocListener( прослушиватель: (контекст, состояние) async { если (состояние временноStoreTripState) { Навигатор.push( контекст, MaterialPageRoute (строитель: (контекст) { возвращаться БлокПровидер.значение( значение: BlocProvider.of(контекст), дочерний элемент: const test(), ); } ), ); } } ) ], ребенок: Эшафот() Это тестовая страница
тест класса расширяет StatefulWidget { const test({super.key}); @переопределить State createState() => _testState(); } класс _testState расширяет State { @переопределить недействительный initState() { супер.initState(); } @переопределить Сборка виджета (контекст BuildContext) { вернуть MultiBlocListener( слушатели: [ BlocListener( слушатель: (контекст, состояние) { печать("триггер"); } ) ], дочерний элемент: эшафот()); } } это main.dart
void main() async{ ВиджетыFlutterBinding.ensureInitialized(); дождитесь Firebase.initializeApp(); ждут dotenv.load(имя_файла: '.env'); проверитьLoggedIn(); } класс MyApp расширяет StatelessWidget { конечная строка InitialRoute; const MyApp({required this.initialRoute, Key? key}) : super(key: key); @переопределить Сборка виджета (контекст BuildContext) { вернуть MultiBlocProvider( провайдеры: [ BlocProvider(create: (контекст BuildContext) => PlaceListBloc()), BlocProvider(create: (контекст BuildContext) => userBloc()), BlocProvider(create: (контекст BuildContext) => tripBloc()) ],child:MaterialApp( debugShowCheckedModeBanner: ложь, начальныйRoute: начальныйRoute, маршруты: { '/login': (контекст) => const WelcomePage(), '/home': (контекст) => NavigationPage(isBackButtonClick:false,autoSelectedIndex: 0,), '/emailVerification': (контекст) => const emailVerificationPage(), }, ), ); } } это tripBloc
class tripBloc расширяет Bloc { Future getOnGoingTrips() async { Список trips = await tripRepo.onGoingTrips(); обратные поездки; } Future PastTrips() async { Список поездок =await tripRepo.pastTrips(); обратные поездки; } Future countTotalTrips() async { int count = ждут tripRepo.countTotalTrips(); счетчик возврата; } Future getRandomImage(tripCount) async { Строковое изображение = ожидание randomImagesRep.getRandomImage(tripCount); вернуть изображение; } tripBloc():супер(InitialTripState()){ on((событие, выброс) async { если (событие временноStoreTripEvent) { вар uuid = const Uuid(); последняя поездка trip=Путешествие( идентификатор поездки: uuid.v1(), tripName: event.tripName, длительностьCount: event.durationCount, КонечнаяДата: event.endDate, tripCoverPhoto: event.tripCoverPhot, tripBudget: event.tripBudget, tripDescription: event.tripDescription, tripDuration: event.tripDuration, tripLocation: event.tripLocation, места: [], ); испускать (временноStoreTripState (поездка)); } иначе, если Я пробую это решение, но оно у меня не работает
Мобильная версия