为什么我的状态不好:在Flutter Flame的组件树中找不到引用SomeGame?

zbwhf8kr  于 2023-03-31  发布在  Flutter
关注(0)|答案(2)|浏览(110)

我想重置游戏到它的初始状态,并删除一个方法中的所有组件。重置后,我得到这个错误:

Bad state: Cannot find reference TurtleGame in the component tree

即使我在类的签名中混入了HasGameRef,gameRef似乎也没有加载。为什么gameRef在游戏第一次启动时有对游戏的引用,并且玩家组件工作正常!但重置后gameRef引用丢失了?

eimct9ow

eimct9ow1#

只要Component被挂载到组件树中,你就只能访问gameRef。所以你不能在构造函数中访问它,或者在组件被移除之后(直到它再次被完全添加到树中)。
如果需要在第一次加载组件时访问onLoad,则覆盖onLoad;如果需要在每次将组件添加到组件树时访问onMount,则覆盖onMount

class YourComponent extends Component with HasGameRef<MyGame> {
  @override
  Future<void> onLoad() {
    // Only runs once, when the component is loaded.
    print(gameRef.size.y);
  }

  @override
  void onMount() {
    // Runs every time that the component is added to the component tree.
    print(gameRef.size.y);
  }
}
pgvzfuti

pgvzfuti2#

对于具有HasGameRef的组件访问游戏引用
1.组件需要像这样添加到游戏类中的游戏中:

MyGame extends FlameGame{
   @override 
   FutureOr<void> onLoad(){
     add(MyComponent());
   }
}

如果组件被移除,它将失去对引用的访问,因此有一个替代方案
1.使用find game method,这样你的组件就可以使用这个方法来找到游戏引用,即使它已经被删除了,就像这样:

class MyComponent extends SpriteComponent with HasGameRef {
    MyComponent(this.myGame);
    Game? myGame;

    @override
    Game? findGame() {
       return myGame ?? super.findGame();
    }
}

相关问题