Флаттер: обновление было вызвано нулем - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь сделать игру с флаттерской библиотекой Flame. Но я получаю эту ошибку каждый раз. Это говорит о том, что обновление называется пустым. Но я инициализировал в функции инициализации. Я пробовал несколько способов, но ничего не получается. Пожалуйста, помогите мне исправить ошибку.

    import 'dart:math';
    import 'dart:ui';

    import 'package:flame/flame.dart';
    import 'package:flame/game.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    import 'package:small_game/components/Enemy.dart';
    import 'package:small_game/components/enemy_spawner.dart';
    import 'package:small_game/components/heath_bar.dart';
    import 'package:small_game/components/highscoreText.dart';
    import 'package:small_game/components/player.dart';
    import 'package:small_game/components/score_text.dart';
    import 'package:small_game/components/startText.dart';
    import 'package:small_game/states.dart' as gameState;

    class GameController extends Game{
      Random rand;
      Size screenSize;
      double tileSize;
      Player player;
      EnemySpawner enemySpawner;
      List<Enemy> enemies;
      HealthBar healthBar;
      int score;
      ScoreText scoreText;
      SharedPreferences storage;
      gameState.State state;
      HighScoreText highScoreText;
      StartText startText;

      GameController(this.storage){
        initialize();
      }

      void initialize() async{
        rand = Random();
        resize(await Flame.util.initialDimensions());
        player = Player(this);
        state = gameState.State.menu;
        enemies = List<Enemy>();
        enemySpawner = EnemySpawner(this);
        healthBar = HealthBar(this);
        score = 0;
        highScoreText = HighScoreText(this);
        startText = StartText(this);
      }

      @override
      void render(Canvas canvas) {
        Rect background = Rect.fromLTWH(0, 0, screenSize.width, screenSize.height);
        Paint backgroundPaint = Paint()..color = Color(0xffFCFCFA);
        canvas.drawRect(background, backgroundPaint);
        player.render(canvas);
        if(state == gameState.State.menu){
           startText.render(canvas);
           highScoreText.render(canvas);
        } else if(state == gameState.State.playing) {
          enemies.forEach((Enemy enemy) => enemy.render(canvas));
          scoreText.render(canvas);
          healthBar.render(canvas);
        }
      }

      @override
      void update(double t) {
        if(state == gameState.State.menu){
          highScoreText.update(t);
          startText.update(t);
        } else if(state == gameState.State.playing) {
          enemies.forEach((Enemy enemy) => enemy.update(t));
          enemies.removeWhere((Enemy enemy) => enemy.isDead);
          player.update(t);
          scoreText.update(t);
          healthBar.update(t);
          enemySpawner.update(t);
        }
      }

      void resize(Size size){
        screenSize = size;
        tileSize = screenSize.width / 10;
      }

      void onTapDown(TapDownDetails d){
        enemies.forEach((Enemy enemy) {
          if(state == gameState.State.menu){
            state = gameState.State.playing;
          }
          if(enemy.enemyRect.contains(d.globalPosition)){
            enemy.onTapDown();
          }
        });
      }

      void spawnEnemies(){
        double x,y;
        switch(rand.nextInt(4)){
          case 0:
            //TOP
            x = rand.nextDouble() * screenSize.width;
            y = -tileSize * 2.5;
            break;
          case 1:
            //RIGHT
            x = (tileSize * 2.5) + screenSize.width;
            y = rand.nextDouble() * screenSize.height;
            break;

          case 2:
            //BOTTOM
            x = rand.nextDouble() * screenSize.width;
            y = (tileSize * 2.5) + screenSize.height;
            break;
          case 3:
            //LEFT
            x = -(tileSize * 2.5);
            y = rand.nextDouble() * screenSize.height;
        }
        enemies.add(Enemy(this, x, y));
      }

    }

Моя ошибка:

I / flutter (20131): ══╡ ИСКЛЮЧЕНИЕ ЗАПИСАНО В БИБЛИОТЕКЕ РАСПИСАНИЯ ╞══════ ══════════════════════════════════════════════════ I / flutter (20131): следующий вызов NoSuchMethodError был выдан во время обратного вызова планировщика: I / flutter (20131): метод 'update' был вызван при нулевом значении. I / flutter (20131): получатель: null I / flutter (20131): пробный вызов: обновление (0.0) I / flutter (20131): I / flutter (20131): когда было сгенерировано исключение, это был стек: I / flutter (20131): # 0
Object.noSuchMethod (dart: core-patch / object_patch.dart: 51: 5) I / flutter (20131): # 1 GameController.update (пакет: small_game / gameController.dart: 69:17) I / flutter (20131): # 2 GameRenderBox._update (пакет: flame / game.dart: 360: 10) I / flutter (20131): # 3 GameRenderBox._tick (пакет: flame / game.dart: 353: 5) I / flutter (20131): # 4 SchedulerBinding._invokeFrameCallback (пакет: flutter / src / scheduler / binding.dart: 1033: 15) I / flutter (20131): # 5 SchedulerBinding.handleBeginFrame. (пакет: flutter / src / scheduler / binding.dart: 951: 11) I / flutter (20131): # 6 _LinkedHashMapMixin.forEach (dart: collection-patch / compact_ha sh .dart: 377: 8) I / flutter (20131): # 7 SchedulerBinding.handleBeginFrame (пакет: flutter / src / scheduler / binding.dart: 949: 17) I / flutter (20131): # 8 SchedulerBinding.scheduleWarmUpFrame. (пакет: flutter / src / scheduler / binding.dart: 780: 7) I / flutter (20131): # 17 _Timer._runTimers (dart: isolate-patch / timer_impl.dart: 382: 19) I / flutter (20131) : # 18 _Timer._handleMessage (dart: isolate-patch / timer_impl.dart: 416: 5) I / flutter (20131): # 19 _RawReceivePortImpl._handleMessage (dart: isolate-patch / isolate_patch.dart: 172: 12) I / трепетание (20131): (пропущено 8 кадров из пакета dart: asyn c и дротика пакета: asyn c -patch) I / flutter (20131): I / flutter (20131): I / flutter (20131): This исключение было выдано в контексте обратного вызова планировщика. Когда обратный вызов планировщика был зарегистрирован (в отличие от того, когда было сгенерировано исключение), это был стек: I / flutter (20131): # 0 new _FrameCallbackEntry. (пакет: flutter / src / scheduler / binding.dart: 112: 33) I / flutter (20131): # 1 новый _FrameCallbackEntry (пакет: flutter / src / scheduler / binding.dart: 115: 6) I / flutter (20131 ): # 2 SchedulerBinding.scheduleFrameCallback (пакет: flutter / src / scheduler / binding.dart: 459: 49) I / flutter (20131): # 3 GameRenderBox._scheduleTick (пакет: flame / game.dart: 341: 50) I / flutter (20131): # 4 GameRenderBox.attach (пакет: flame / game.dart: 328: 5) I / flutter (20131): # 5 RenderObjectWithChildMixin.attach (пакет: flutter / src / render / object.dart: 2886 : 14) I / flutter (20131): # 6 AbstractNode.adoptChild (пакет: flutter / src / foundation / node.dart: 132: 13) I / flutter (20131): # 7 RenderObject.adoptChild (пакет: flutter / src /rendering/object.dart:1232:11) I / flutter (20131): # 8 RenderObjectWithChildMixin.child = (пакет: flutter / src / render / object.dart: 2879: 7) I / flutter (20131): # 9 RenderObjectToWidgetElement.insertChildRenderObject (package: flutter / src / widgets / binding.dart: 1020: 18) I / flutter (20131): # 10 RenderObjectElement.att achRenderObject (пакет: flutter / src / widgets / framework.dart: 4986: 35) I / flutter (20131): # 11 RenderObjectElement.mount (пакет: flutter / src / widgets / framework.dart: 4752: 5) I / flutter (20131): # 12 Element.inflateWidget (пакет: flutter / src / widgets / framework.dart: 3101: 14) I / flutter (20131): # 13 Element.updateChild (пакет: flutter / src / widgets / framework. дротик: 2904: 12) I / flutter (20131): # 14 ComponentElement.performRebuild (пакет: flutter / src / widgets / framework.dart: 3961: 16) I / flutter (20131): # 15 Element.rebuild (пакет: flutter / src / widgets / framework.dart: 3738: 5) I / flutter (20131): # 16 ComponentElement._firstBuild (пакет: flutter / src / widgets / framework.dart: 3924: 5) I / flutter (20131): # 17 ComponentElement.mount (пакет: flutter / src / widgets / framework.dart: 3919: 5) I / flutter (20131): # 18 Element.inflateWidget (пакет: flutter / src / widgets / framework.dart: 3101: 14 ) I / flutter (20131): # 19 Element.updateChild (пакет: flutter / src / widgets / framework.dart: 2904: 12) I / flutter (20131): # 20 RenderObjectToWidgetElement._rebuild (пакет: flutter / src / widgets /binding.dart:998:16) I / flutter (20131): # 21 RenderObjectToWidgetElement.mount (пакет: flutter / src / widgets / binding.dart: 969: 5) I / flutter (20131): # 22 RenderObjectToWidgetAdapter.attachToRender , (пакет: flutter / src / widgets / binding.dart: 915: 17) I / flutter (20131): # 23 BuildOwner.buildScope (пакет: flutter / src / widgets / framework.dart: 2328: 19) I / flutter ( 20131): # 24 RenderObjectToWidgetAdapter.attachToRenderTree (пакет: flutter / src / widgets / binding.dart: 914: 13) I / flutter (20131): # 25 WidgetsBinding.attachRootWidget (пакет: flutter / src / widgets / binding. 795: 7) I / flutter (20131): # 26 runApp (пакет: flutter / src / widgets / binding.dart: 845: 7) I / flutter (20131): # 27 main (пакет: small_game / main.dart: 17: 3) I / flutter (20131): (исключено 14 кадров из пакета dart: asyn c и пакета dart: asyn c -patch)

1 Ответ

1 голос
/ 01 февраля 2020

Ваша initialize функция имеет асин c, что означает, что она будет работать в фоновом режиме. Поэтому, когда сначала вызывается обновление, startText является нулевым и дает вам NPE. Вы, вероятно, захотите добавить некоторую проверку на update, чтобы убедиться, что она инициализирована, прежде чем двигаться вперед с кодом обновления, или сделать initialize syn c, а затем делать все, что нужно asyn c позже (после инициализации startText конечно не один из них).

...