在屏幕最初加载后,我正在努力将异步数据绘制到 Flutter 画布中。我想知道构建我的工作流程以允许更新的最佳方式。
屏幕的整个生命周期如下所示:
1. An async request is performed using data from a class called ScreenData
2. We paint the canvas with result (initial load)
3. A notification comes in from a ScreenData provider (using ChangeNotifierProvider)
4. Perform async request with the new ScreenData object
4. Repaint canvas with result
我了解第 1、2 和 3 点的工作原理,第 3 和 4 点有点棘手。
该类ScreenData
包含一些在异步调用中使用的简单数据,在绘制屏幕时需要其结果。
我被困在哪里
我可以通过Listenable listenable = Provider.of<ScreenData>(context, listen: true);
以下函数确保在 ScreenData 更新时画布调用重绘:
class CanvasPainter extends CustomPainter {
CanvasPainter({
required Listenable listenable,
}) : super(repaint: listenable);
@override
void paint(Canvas canvas, Size size) {
// draw something
}
@override
bool shouldRepaint(CustomPainter old) => true;
}
但是,我需要使用这个新ScreenData
对象执行异步请求,然后paint
才能调用另一个对象。我不知道把它放在哪里,因为paint
需要同步。
有没有一种简单的方法可以确保我在paint
调用之前预加载了所有数据?