Flutter Bloc:BlocBuilder在更新后没有被调用,ListView仍然显示旧数据

问题描述 投票:0回答:1

我正在使用flutter_bloc进行状态管理并着手解决这个问题。更新字段并保存时,BlocBuilder不会刷新页面。添加或删除时工作正常。我不确定我在这里做错了什么。

即使我转到另一个屏幕并返回到此屏幕,即使文件已更新,它仍会显示旧数据。

我花了两个多小时试图调试这个无济于事。我尝试初始化updatedTodos = []然后逐个添加每个待办事项,看看是否有所作为,但这也不起作用。

任何帮助在这里将不胜感激。

TodosBloc.dart:

Stream<TodosState> _mapUpdateTodoToState(
    TodosLoaded currentState,
    UpdateTodo event,
  ) async* {     
        if (currentState is TodosLoaded) {
        final index = currentState.Todos
            .indexWhere((todo) => event.todo.id == todo.id);
        final List<TodoModel> updatedTodos =
            List.from(currentState.todos)
              ..removeAt(index)
              ..insert(index, event.todo);

        yield TodosLoaded(updatedTodos);
        _saveTodos(updatedTodos);
      }
  }

todos_screen.dart:

...
Widget build(BuildContext context) {
    return BlocBuilder(
      bloc: _todosBloc,
      builder: (BuildContext context, TodosState state) {
        List<TodoModel> todos = const [];
        String _strings = "";
        if (state is TodosLoaded) {
          todos = state.todos;
        }
        return Expanded(
          child: ListView.builder(
            itemCount: todos.length,
            itemBuilder: (BuildContext ctnx, int index) {
              return Dismissible(
                key: Key(todo.toString()),
                child: DetailCard(
                  todo: todos[index],
                ),
              );
            },
          ),
        );
...

我期待BlocBuilder被调用并刷新ListView。

flutter bloc
1个回答
3
投票

我能够在Felith Angelov的帮助下在github上解决这个问题。问题是我扩展了Equatable但没有将道具传递给TodoModel类中的超类。我不得不用super([])更新TodoModel的构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.