我有一个益智游戏应用程序。(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(),
],
),
),
),
],
),
),
);
}
}