Flutter Bloc:更新后未调用BlocBuilder,ListView仍显示旧数据

时间:2019-04-03 20:32:17

标签: flutter bloc

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

即使我转到其他屏幕并返回此屏幕,即使文件已更新,它仍然显示旧数据。

我花了2个多小时试图调试它,但无济于事。我尝试初始化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。

1 个答案:

答案 0 :(得分:1)

我能够在github上的Felix Angelov的帮助下解决此问题。 问题是我正在扩展Equatable,但没有将道具传递给TodoModel类的超类。我必须用super([])更新TodoModel的构造函数。