我对颤振开发和整体模式不熟悉,我正在尝试编写一个简单的笔记应用程序。我有一个由homeloc管理的主屏幕
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final homeBloc = HomeScreenBloc();
@override
void initState() {
print("CALL init state");
homeBloc.add(LoadUserNoteEvent());
super.initState();
}
@override
Widget build(BuildContext context) {
final themeData = Theme.of(context);
return BlocConsumer<HomeScreenBloc, HomeState>(
bloc: homeBloc,
buildWhen: (previous, current) => current is! HomeScreenAction,
listener: (context, state) {
print("Listen for a state : ${state.runtimeType}");
if(state is AddNoteButtonPressed){
Navigator.of(context).push(MaterialPageRoute(builder: (context) => const AddNotePage()));
}
},
builder: (context, state) {
print("Get a state : ${state.runtimeType}");
if(state is UserNoteListState){
return Scaffold(
appBar: AppBar(
title: const Text("Flutter Notes"),
centerTitle: Platform.isAndroid ? false : true,
actions: [
IconButton(onPressed: () {}, icon: const Icon(Icons.menu)),
],
),
floatingActionButton: FloatingActionButton(
onPressed: () {
onFabButtonPressed();
},
backgroundColor: themeData.colorScheme.primary,
foregroundColor: themeData.colorScheme.onPrimary,
child: const Icon(Icons.add),
),
body: Column(
children: [
const TopSection(),
Flexible(
child: NoteListWidget(userNoteList: state.userNoteList)
),
],
),
);
}else{
return Text("Error");
}
},
);
}
void onFabButtonPressed () {
homeBloc.add(OnFloatingActionButtonPressed());
}
}
当我启动应用程序时,状态成功加载并显示注释列表。导航按钮成功发送事件并接收响应以导航到另一个屏幕。当我点击按钮删除注释时,逻辑工作正常。发送事件,注释从列表中删除,各种打印确认,但flutter不会向ui重新发出状态,以在没有元素的情况下重新绘制列表。我知道这可能取决于这样一个事实,即如果欧盟认为状态与前一个状态相同,它就不会触发它。我已经尝试了各种修复方法。。但我不明白如何在这些情况下让国家有所不同。
这是我的homeBloc代码:
class HomeScreenBloc extends Bloc<HomeEvent, HomeState> {
final getNoteUseCase = GetNoteUsesCase();
final removeNoteUseCase = RemoveNoteUseCase();
HomeScreenBloc() : super(UserNoteListState(userNoteList: [])) {
on<OnFloatingActionButtonPressed>(navigateToAddnoteEvent);
on<LoadUserNoteEvent>(loadUserNoteData);
on<RemoveNoteEvent>(removeNote);
}
FutureOr<void> navigateToAddnoteEvent(OnFloatingActionButtonPressed event, Emitter<HomeState> emit) {
emit(AddNoteButtonPressed());
}
FutureOr<void> loadUserNoteData(LoadUserNoteEvent event, Emitter<HomeState> emit) {
final data = List<NoteEntity>.from(getNoteUseCase.getNotelist());
emit(UserNoteListState(userNoteList: data));
}
FutureOr<void> removeNote(RemoveNoteEvent event, Emitter<HomeState> emit) {
removeNoteUseCase.removeNote(event.removeNote);
emit(UserNoteListState(userNoteList: getNoteUseCase.getNotelist()).copyWith(getNoteUseCase.getNotelist()));
}
}
这里是国家阶级
abstract class HomeState {
const HomeState();
}
abstract class HomeScreenAction extends HomeState {}
class UserNoteListState extends HomeState with EquatableMixin {
final List<NoteEntity> userNoteList;
UserNoteListState({required this.userNoteList});
@override
List<Object?> get props => [];
UserNoteListState copyWith (List<NoteEntity> userNoteList){
return UserNoteListState(
userNoteList: userNoteList
);
}
}
class AddNoteButtonPressed extends HomeScreenAction {
AddNoteButtonPressed();
}
我希望在从列表中删除注释后触发RemoveNote事件时,该事件将再次触发以刷新列表。