0

我有一个益智游戏应用程序。(https://play.google.com/store/apps/details?id=com.karolinadart.blackbox

当玩家认为他们已经解决了这个难题时,他们会按下“这是我的最终答案”按钮,此时会计算分数。一个新的屏幕被推开,显示分数。

但是分数计算是一个相当繁重的计算,可能需要几秒钟,具体取决于特定设置的复杂性。因此,我制作了计分功能async,并尝试在等待计算完成时显示一个微调器……但这不起作用!我试过在计算之前启动微调器,看看它是否开始......确实如此,但是在计算开始的那一刻,微调器冻结了。

我应该如何对其进行编程,以便可以在后台进行繁重的计算,同时让手机可以自由地做其他事情,例如显示微调器,甚至继续游戏中的其他任务?


这些是结果显示代码的主要特点:

import 'package:intl/intl.dart';
import 'package:blackbox/my_firebase_labels.dart';
import 'package:blackbox/units/small_widgets.dart';
import 'package:blackbox/firestore_lables.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:blackbox/board_grid.dart';
import 'package:blackbox/play.dart';
import 'package:blackbox/constants.dart';
import 'package:blackbox/atom_n_beam.dart';
import 'package:collection/collection.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:blackbox/game_hub_updates.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';
import 'package:provider/provider.dart';

class SentResultsScreen extends StatefulWidget {
  SentResultsScreen({@required this.setupData, @required this.resultPlayerId});
  final Map<String, dynamic> setupData;
  final String resultPlayerId;

  @override
  _SentResultsScreenState createState() => _SentResultsScreenState(setupData, resultPlayerId);
}

class _SentResultsScreenState extends State<SentResultsScreen> {
  _SentResultsScreenState(this.setupData, this.resultPlayerId);
  final Map<String, dynamic> setupData;
  final String resultPlayerId;
  FirebaseFirestore firestoreObject = FirebaseFirestore.instance;
  Play thisGame;  // My own class, containing all the logic of the game
  bool resultsReady = false;
  String errorMsg = '';
  int beamScore;
  int atomScore;
  int totalScore;
  bool awaitingData = false;
  List<dynamic> alternativeSolutions;
  bool showSpinner = true;

  @override
  void initState() {
    super.initState();
    getGameData();
  }

  void getGameData() async {
    await Future.delayed(Duration(milliseconds: 500));  // The spinner spins for this duration, then freezes
    Map<String, dynamic> setupData = widget.setupData;

    if (setupData == null) {
      setState(() {
        errorMsg = 'Document contains no data';
        showSpinner = false;
      });
    } else {
      thisGame = Play(setupData);
      alternativeSolutions = await thisGame.getScore();  // This is the heavy calculation!
    }
       setState(() {
         totalScore = thisGame.atomScore + thisGame.beamScore;
         resultsReady = true;
         showSpinner = false;
       });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('blackbox')),
      body: ModalProgressHUD(
        inAsyncCall: showSpinner,
        child: Column(
          children: <Widget>[
            Expanded(
              child: FittedBox(
                fit: BoxFit.scaleDown,
                child: Column(
                  children: [
                    Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      children: <Widget>[
                        Text('My score'),
                        Text(
                          'beam score:  ${resultsReady ? '${thisGame.beamScore}' : '...'}',
                        ),
                        Text(
                          'atom penalty:  ${resultsReady ? '${thisGame.atomScore} ' : '...'}',
                        ),
                        Text(
                          'total: $totalScore'  // Will be null if results are not ready
                        ),
                      ],
                    ),
                  ),
                ),
                alternativeSolutions != null
                   ? Text(
                      'Multiple solutions exist!',
                    )
                   : SizedBox(),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

4

1 回答 1

0

当您启动一个异步方法时,它将在与 UI 相同的线程中计算。这就是你的问题的原因。它可以使用隔离解决。它们对应于例如Java 中的线程。有关更多信息,您可以观看来自 Flutter for Isolates 的视频: https ://youtu.be/vl_AaCgudcY

于 2021-04-24T13:28:07.597 回答