【发布时间】:2021-10-14 14:26:26
【问题描述】:
如果这是一个简单的解决方法,请原谅我,但我是 Flutter 的新手,我在寻找解决方案时遇到了麻烦。我有一个无状态小部件MySpriteGame,它使用SpriteWidget。我有另一个名为SpriteSquare 的小部件,也是无状态的,我正在尝试向其添加事件处理程序。我将在最后添加两者的代码(减去所有导入以最大化空间)。
想要将一个函数从MySpriteGame 传递到SpriteSquare,该函数基本上将_whitesquare(SpriteSquare 的一个实例)添加到_background(SpriteSquare 的另一个实例)。我遇到的问题如下。
The instance member 'handleEvent' can't be accessed in an initializer.
我知道这是因为我无法在这些变量的初始化中添加将_whitesquare 添加到_background 的函数。如果MySpriteGame 是有状态的,我可能会将侦听器添加到initState 或其他内容中。我想知道是否有办法在初始化后将这些事件侦听器添加到 SpriteSquare 节点,而不必使这个小部件有状态?
sprite_square.dart
class SpriteSquare extends NodeWithSize {
Color color;
Function handler;
SpriteSquare(size, this.color, this.handler) : super(size){
userInteractionEnabled = true;
}
@override handleEvent(SpriteBoxEvent event) {
handler(event);
return true;
}
@override
Future<void> paint(Canvas canvas) async {
applyTransformForPivot(canvas);
canvas.drawRect(
new Rect.fromLTWH(0.0, 0.0, size.width, size.height),
Paint()..color = color
);
}
}
sprite_game.dart
class MySpriteGame extends StatelessWidget {
final _background = SpriteSquare(const Size(400.0, 400.0), const Color(0xFF000000), (e)=>handleEvent(e));
final _whitesquare = SpriteSquare(const Size(200.0, 200.0), const Color(0xFFFFFFFF), (e)=>handleEvent(e));
MySpriteGame({Key? key}) : super(key: key);
handleEvent(SpriteBoxEvent event) {
_background.addChild(_whitesquare);
return true;
}
handleRemoveSelf(SpriteBoxEvent event){
print(event);
return true;
}
@override
Widget build(BuildContext context) {
return Center(
child: Container(
child:
SpriteWidget(
_background
)
),
);
}
}
编辑
我觉得我可能会通过在Widget build... 之后和return Center... 之前添加函数来完成某些事情。我可以做到_background.handleEvent(),但我不确定如何将上面handleEvent 中的逻辑添加到这个handleEvent 中。
【问题讨论】:
-
Non-
latemember variables are initialized beforethisis valid。在您的情况下,最简单的解决方法可能是使用late final声明这些成员。
标签: flutter dart widget sprite