dart - Flutter:当我修改一个项目时,我的 ListView 没有更新

标签 dart flutter bloc

我正在使用 BloC 架构模式开发一个“todo”flutter 应用。

我的“主页”用户界面显示待办事项列表,用户可以单击该项目的按钮将状态从“待办事项”更改为“完成”。

当一个项目完成时,它应该以另一种颜色显示,以区别于其他未完成的待办事项。

但是当我点击“完成”按钮时, ListView 没有更新。

下面是我的 UI 代码:

class HomePage extends StatelessWidget {
  final TodoRepository _todoRepository;
  final HomeBloc bloc;

  HomePage(this._todoRepository) : this.bloc = HomeBloc(_todoRepository);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: StreamBuilder<List<Task>>(
            stream: bloc.todos,
            builder: (context, snapshot) {
              return ListView(
                children: snapshot.data.map(_buildItem).toList(),
              );
            }),
      ),
    );
  }

  Widget _buildItem(Todo todo) {
    if (todo.complete) {
      return completed(todo);
    } else {
      return inCompleted(todo);
    }
  }

  Widget inCompleted(Todo todo) {
    return MaterialButton(
      textColor: Colors.white,
      color: Colors.green,
      child: Text("Complete"),
      onPressed: () {
        bloc.done.add(todo);
      }
    );
  }

  Widget completed(Todo todo) {
    return MaterialButton(
      textColor: Colors.white,
      color: Colors.red,
      child: Text("Cancel"),
      onPressed: () {
        bloc.done.add(todo);
      }
    );
  }
}

这是我的 BloC 类:

class HomeBloc {

  final _getTodosSubject = PublishSubject<List<Todo>>();
  final _doneTodoSubject = PublishSubject<Todo>();
  final _cancelTodoSubject = PublishSubject<Todo>();

  final TodoRepository _todoRepository;

  var _todos = <Todo>[];

  Stream<List<Todo>> get todos => _getTodosSubject.stream;

  Sink<Todo> get done => _doneTodoSubject.sink;

  Sink<Todo> get cancel => _doneTodoSubject.sink;

  HomeBloc(this._todoRepository) {
    _getTodos().then((_) {
      _getTodosSubject.add(_todos);
    });

    _doneTodoSubject.listen(_doneTodo);

    _cancelTodoSubject.listen(_cancelTodo);
  }

  Future<Null> _getTodos() async {
    await _todoRepository.getAll().then((list) {
      _todos = list;
    });
  }

  void _doneTodo(Todo todo) {
    todo.complete = true;
    _update(todo);
  }

  void _cancelTodo(Todo todo) async {
    todo.complete = false;
    _update(todo);
  }

  void _update(Todo todo) async {
    await _todoRepository.save(todo);
    _getTodos();
  }

}

最佳答案

这是因为您在调用 getTodos() 后没有“刷新”您的列表,这里是修改:

HomeBloc(this._todoRepository) {
    _getTodos() //Remove the adding part it's done in the function

    _doneTodoSubject.listen(_doneTodo);

    _cancelTodoSubject.listen(_cancelTodo);
  }

  Future<Null> _getTodos() async {
    await _todoRepository.getAll().then((list) {
      _todos = list;
      _getTodosSubject.add(list); //You can actually remove the buffer _todos object 
    });
  }

正如我在评论中提到的,您可以删除 _todos 缓冲区,但我不想折射太多您的代码。

通过这几个调整,它应该可以工作。 希望对您有所帮助!!

关于dart - Flutter:当我修改一个项目时,我的 ListView 没有更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55362073/

相关文章:

dartanalyzer 不会对缺少接口(interface)的实现发出警告

dart - 如何强制flutter使用wifi而不是4G?

asynchronous - Flutter 创建一个 Utility 类但无法调用异步函数

dart - 在 Dart 中映射到类

flutter - 如何管理同一 Bloc 内的不同国家? flutter

flutter 下拉失败断言行 620

flutter - CachedNetworkImage 图像不改变同名

Flutter Container Box Constraints 没有按预期工作

flutter - 如何向 `showSearch` 提供 BLoC(带有 flutter_bloc)

dart - 如何管理 Flutter 中的对象列表流?