【问题标题】:Flutter: Unable to add local function in initializationFlutter:无法在初始化中添加本地函数
【发布时间】:2021-10-14 14:26:26
【问题描述】:

如果这是一个简单的解决方法,请原谅我,但我是 Flutter 的新手,我在寻找解决方案时遇到了麻烦。我有一个无状态小部件MySpriteGame,它使用SpriteWidget。我有另一个名为SpriteSquare 的小部件,也是无状态的,我正在尝试向其添加事件处理程序。我将在最后添加两者的代码(减去所有导入以最大化空间)。

想要将一个函数从MySpriteGame 传递到SpriteSquare,该函数基本上将_whitesquareSpriteSquare 的一个实例)添加到_backgroundSpriteSquare 的另一个实例)。我遇到的问题如下。

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 中。

【问题讨论】:

标签: flutter dart widget sprite


【解决方案1】:

我不确定这是否是最佳实践,但我能够使用()=&gt;{} 作为处理程序来初始化_background。然后在Widget build... 之后,我有_background.handler = handleAdd; 行,它使我能够将handleAdd 中的逻辑应用于handleEvent 这个SpriteSquare 实例。

我现在可以将_whitesquare 添加到_background

【讨论】:

  • 仅供参考,() =&gt; {} 是一个返回空 Set 的函数。如果你想要一个什么都不做的函数,请使用() {}
  • @jamesdlin 很高兴知道
猜你喜欢
  • 2021-09-20
  • 2022-08-04
  • 2020-12-22
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多