代码之家  ›  专栏  ›  技术社区  ›  Lanma

从列表中删除项目后,块不会发送状态

  •  0
  • Lanma  · 技术社区  · 2 年前

    我对颤振开发和整体模式不熟悉,我正在尝试编写一个简单的笔记应用程序。我有一个由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事件时,该事件将再次触发以刷新列表。

    0 回复  |  直到 2 年前