异步完成后Flutter Bloc更新对象状态

时间:2020-04-15 07:56:49

标签: flutter flutter-bloc

我正在处理抖动和集团模式。 Todo教程(https://bloclibrary.dev/#/fluttertodostutorial?id=bloc)很好地解释了该团体。

但是不,我不希望使用有关“对象同步已完成/正在运行”的信息来扩展示例应用程序。我已附上一张图片,说明其工作原理。

flow

我认为以下功能正在执行类似操作-更改完整布尔值。但是如何更改函数以在异步调用后更改1 obj的布尔值并将其直接触发到UI。在obj 1之后转到obj 2,依此类推。

Stream<TodosState> _mapToggleAllToState() async* {
    if (state is TodosLoadSuccess) {
      final allComplete =
          (state as TodosLoadSuccess).todos.every((todo) => todo.complete);
      final List<Todo> updatedTodos = (state as TodosLoadSuccess)
          .todos
          .map((todo) => todo.copyWith(complete: !allComplete))
          .toList();
      yield TodosLoadSuccess(updatedTodos);
      _saveTodos(updatedTodos);
    }
  } 

希望您能理解我的解释并能帮助我:-)

1 个答案:

答案 0 :(得分:0)

我可以解决我的问题:-)我想分享它。

随时添加带有反馈和提示的评论!

  Stream<DocsState> _mapTodosSyncToState() async* {
    final todos = (state as TodosLoadSuccess).todos;
    await for (Todo syncTodo in Stream.fromIterable(todos)) {
      List<Todo> updatedTodos = (state as TodosLoadSuccess).todos.map((todo) {
        return todo.id == syncTodo.id
            ? syncTodo.copyWith(task: syncTodo.task + " SYNCING")
            : todo;
      }).toList();
      yield TodosLoadSuccess(updatedTodos);

      await Future.delayed(Duration(seconds: 3));

      updatedTodos = (state as TodosLoadSuccess).todos.map((todo) {
        return todo.id == syncTodo.id
            ? syncTodo.copyWith(task: syncTodo.task + " COMPLETE")
            : todo;
      }).toList();

      yield TodosLoadSuccess(updatedTodos);
    }

  }