当bloc状态从Equatable扩展时,我只能导航到另一个屏幕。否则,当状态不是从Equatable扩展时,我可以导航到我想要的另一个屏幕。
我知道状态和事件应该从最佳实践的Equatable扩展,以便能够运行块测试。也可以用第二个块覆盖第二个屏幕上的后退按钮行为,然后执行Navigator.of(context).push(MaterialPageRoute(builder: (_) {return const FirstPage();})),但这似乎是一个错误的举动。
问:是否可以使用Equatable多次导航到其他屏幕,而不会覆盖第二个屏幕上的后退按钮功能?
代码:
区块
// main_bloc.dart
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
// bloc
class MainBloc extends Bloc<MainEvent, MainState> {
MainBloc() : super(MainInitial()) {
on<OpenSecondPageEvent>((event, emit) {
emit(OpeningSecondPageState());
});
}
}
// States
abstract class MainState extends Equatable {
const MainState();
@override
List<Object> get props => [];
}
class MainInitial extends MainState {}
class OpeningSecondPageState extends MainState {}
// Events
abstract class MainEvent extends Equatable {
const MainEvent();
@override
List<Object> get props => [];
}
class OpenSecondPageEvent extends MainEvent {}用户界面
// main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BlocProvider(
create: (context) => MainBloc(),
child: BlocConsumer<MainBloc, MainState>(
listener: (context, state) {
if (state is OpeningSecondPageState) {
Navigator.of(context).push(MaterialPageRoute(builder: (_) {
return const SecondPage(); // <- Navigating to second screen
}));
}
},
builder: (context, state) {
return Scaffold(
appBar: AppBar(
title: const Text('Page A'),
),
body: Center(
child: ElevatedButton(
child: const Text('Open Page B'),
onPressed: () =>
context.read<MainBloc>().add(OpenSecondPageEvent()),
),
),
);
},
),
),
);
}
}
class SecondPage extends StatelessWidget {
const SecondPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Page B'),
),
body: Container(),
);
}
}使用Equatable

没有Equatable

发布于 2021-11-01 12:21:54
作为一种解决方法,可以在OpenSecondPageState()之后立即发出MainInitial()状态。
我不认为这是最终的解决方案,但它或多或少是整洁的。
在代码中查找// <- Added part。
更新的区块:
// main_bloc.dart
import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
// bloc
class MainBloc extends Bloc<MainEvent, MainState> {
MainBloc() : super(MainInitial()) {
on<OpenSecondPageEvent>((event, emit) {
emit(OpeningSecondPageState());
emit(MainInitial()); // <- Added part
});
}
}
// States
abstract class MainState extends Equatable {
const MainState();
@override
List<Object> get props => [];
}
class MainInitial extends MainState {}
class OpeningSecondPageState extends MainState {}
// Events
abstract class MainEvent extends Equatable {
const MainEvent();
@override
List<Object> get props => [];
}
class OpenSecondPageEvent extends MainEvent {}UI部件相同
https://stackoverflow.com/questions/69770279
复制相似问题