我有一个简单的应用程序与Task
的列表。每个Task
是时间限制。
@freezed
class Task with _$Task {
const factory Task({
@Default('') String title,
required DateTime start,
required DateTime end,
}) = _Task;
}
然后,我使用提供程序显示任务,例如:
class TasksController extends StateNotifier<List<Task>> {
TasksController()
: super(const []) {
init();
}
Future<void> init() async {
state = await GetTasksFromSomeRepo();
}
}
我希望显示指示器,指示任务正在执行,例如:
有一个简单的解决方案,我每1秒重建Task
的小部件的整个列表,使用:
Timer.periodic(Duration(seconds: 1), (Timer t) {
setState(() {
// this calls build method
});
});
并且在build
方法本身中,我检查DateTime.now()
是否在每个Task
的“开始/结束”边界内。
问题:
1.如何以更有效的方式来做这件事,最好是在Riverpod的帮助下?
3条答案
按热度按时间nle07wnf1#
使用
setState
的更高效的解决方案,这里TaskContainer
小部件最多重建两次。测试它的示例页面。
编辑:使用Riverpod实施
您可以通过使用一系列将任务作为参数的提供程序来实现同样的目的。您的
Task
类应该是不可变的,并且应该覆盖== operator
和hashcode
。提供者:
将
TaskContainer
转换为ConsumerWidget
:xggvc2p62#
任务解析器.dart:
在UI.dart上:
4xrmg8kj3#
因为您不与任何API通信,所以检查正在进行的事情的唯一方法是,正如您在问题中提到的,使用计时器。
但是,您可以做的是,通过访问
TasksController
来更改task
中的某些内容(您可以创建一个新变量state
),而不是调用setState
。如果实现正确,应该会触发状态更改,只重建正确的小部件,而不是整个小部件树。