flutter 如何在构造函数中创建变量并将其传递给super()

k4emjkb1  于 2023-04-22  发布在  Flutter
关注(0)|答案(1)|浏览(171)

我正在尝试编写一个类FadePainter,它使用自定义GLSL着色器扩展CustomPainter。(间接)一个async操作。我想在我的FadePainter类中完成这个操作,因为我不想把它作为参数传递。我可以很容易地从我的构造函数触发load函数,但是我需要一些方法来触发一个重绘一旦它完成加载.这可以用可选的repaintListenable参数为CustomPainter.
然而,我找不到任何方法将Listenable(如ChangeNotifier)传递给super构造函数,同时将其存储在FadePainter类中,所以我实际上可以触发它。我想做的是这样的事情:

class FadePainter extends CustomPainter {
  FadePainter() {
    final repaint = ChangeNotifier();
    loadShader(repaint); // Pass ChangeNotifier to loadShader, which can then use it to trigger repaint
    super(repaint: repaint);
  }
}

或者甚至:

class FadePainter extends CustomPainter {
  final ChangeNotifier repaint = ChangeNotifier();

  FadePainter() : super(repaint: repaint);
}

但这两个都不是有效的语法。第一个抱怨super()不计算为函数(因为super构造函数在Dart中不这样工作);第二个声明示例成员不能在构造函数中被访问。
有两个明显的替代方案,我都不喜欢:

  • 我可以传递一个ChangeNotifierFadePainter构造函数。然而,这只需要在这种非常特定的情况下在内部使用。将它作为参数传递没有意义。
  • 我可以实现CustomPainter并扩展ChangeNotifier,但这增加了许多(看起来)不必要的样板文件。

我怎么才能让它工作?

9w11ddsr

9w11ddsr1#

您可以将默认构造函数重定向到私有的中间构造函数,以便将ChangeNotifier绑定到构造函数参数:

class FadePainter extends CustomPainter {
  final ChangeNotifier repaint;

  FadePainter() : this._(ChangeNotifier());

  FadePainter._(this.repaint)
    : super(repaint: repaint);
}

相关问题