寻找Flutter的.toImage()方法的同步替代方法

时间:2019-04-11 13:23:45

标签: flutter async-await

此刻,我正在尝试Flutter和Flame游戏引擎。 为此,我扩展了Flame的BaseGame类,并在其构造函数中进行了一些繁重的处理。 繁重的处理过程包括从其他图像中合成一个图像,并最终将其绘制到临时Canvas上,并将结果存储在Picture对象中。

ui.PictureRecorder rec = new ui.PictureRecorder();
Canvas tempCanvas = new Canvas(rec, bgRect);
// left out picture operations
ui.Picture pic = rec.endRecording();

要最终获得Image对象,我需要调用异步的 .toData()方法,该方法返回Future。 我将调用包装在异步方法getImage()

getImage(ui.Picture pic, Rect bgRect) async {
    background = await pic.toImage(bgRect.width.toInt(), bgRect.height.toInt());
    done = true;
}

背景是Image类型的类变量,该类变量在BaseGame类的render()方法内使用)

问题是,由于它是异步的,因此我在游戏的构造函数中执行的其余语句都将被执行,完成后,将触发render()方法,但背景可能尚不可用。 要解决此问题,我添加了一个类型为bool的类变量 done ,该变量在getImage()方法中设置为true。 现在,我修改了render()以等待done变为真。

void render(Canvas canvas) {
    if (done) {
        canvas.drawImage(background, new Offset(0.0, 0.0), new Paint());
    }
}

这当然不是很优雅。 有没有办法等待.toImage()方法在扩展BaseGame类的构造函数内部完成? 我试图使构造函数异步:

class TheGame extends BaseGame {
    Image background;
    bool done = false;

    TheGame(DeviceOrientation orientation) async {  
    }
}

但这给了我错误:

  

修饰符'async'不能应用于构造函数的主体

我还能尝试使其“同步”吗?

1 个答案:

答案 0 :(得分:0)

如果在渲染第一帧之前确实需要图像,则可以创建一个负责创建TheGame

的静态方法。
class TheGame extends BaseGame {
    final Image background;

    TheGame._(DeviceOrientation orientation, this.background);

    static Future<TheGame> create(DeviceOrientation orientation) async {
      return TheGame._(orientation, await generateImage());
    }
}

但是我想如果您渲染一些没有背景图像的帧并不会真正造成伤害,那么我建议您只检查background != null而不是done属性,这有点多余