Flutter:无法在初始化中添加本地功能
Flutter: Unable to add local function in initialization
如果这是一个简单的修复,请原谅我,但我是 Flutter 的新手,我很难找到解决方案。我有一个无状态小部件 MySpriteGame
,它使用 SpriteWidget
。我有另一个名为 SpriteSquare
的小部件,也是无状态的,我正在尝试向其添加事件处理程序。我将在最后添加两者的代码(减去所有导入以最大化 space)。
想要将一个函数从 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
.
我不确定这是否是最佳做法,但我能够使用 ()=>{}
作为处理程序来初始化 _background
。然后在 Widget build...
之后我有行 _background.handler = handleAdd;
这使我能够将 handleAdd
中的逻辑应用到 handleEvent
这个 SpriteSquare
.[=19 实例=]
我现在可以将 _whitesquare
添加到 _background
。
如果这是一个简单的修复,请原谅我,但我是 Flutter 的新手,我很难找到解决方案。我有一个无状态小部件 MySpriteGame
,它使用 SpriteWidget
。我有另一个名为 SpriteSquare
的小部件,也是无状态的,我正在尝试向其添加事件处理程序。我将在最后添加两者的代码(减去所有导入以最大化 space)。
想要将一个函数从 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
.
我不确定这是否是最佳做法,但我能够使用 ()=>{}
作为处理程序来初始化 _background
。然后在 Widget build...
之后我有行 _background.handler = handleAdd;
这使我能够将 handleAdd
中的逻辑应用到 handleEvent
这个 SpriteSquare
.[=19 实例=]
我现在可以将 _whitesquare
添加到 _background
。