4

我正在使用 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。

4

2 回答 2

16

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

于 2019-04-04T02:33:54.710 回答
1

这是我解决问题的方式,即使它不是最好的解决方案,但我会分享它,当你在另一个屏幕上你应该显示数据或其他东西时,按下后退按钮调用 dispose,如图所示以下

 @override
 void initState() {
   super.initState();
   print("id" + widget.teamID);
   BlocProvider.of<FootBallCubit>(context).getCurrentTeamInfo(widget.teamID);
 }

 // what i noticed upon closing this instance of screen , it deletes old data
 @override
 void dispose() {
   super.dispose();
   Navigator.pop(context);
 }
于 2021-08-28T05:21:01.060 回答