Flutter:数据库访问过快



这是一个非常基本的问题,但我被卡住了,如果有任何帮助,我将不胜感激。

我正在使用配置单元数据库,并且有一个条件来检查数据库是否为空。如果它是空的,我有一个函数可以将另一个数据库复制到它。但是在复制完成之前调用了该数据库,导致RangeError:0。如何让它等到副本完成后再访问?

呼叫代码

Box db = Hive.box<CardFields>("starter_worker");
dbcheck(db);
int currentcardindex = randomcard(db); // Function to generate random index based on db length
CardFields currentCard = db.getAt(currentcardindex);

dbcheck((

dbcheck(Box db) async {
if (db.isEmpty) {
await refilldb("starter");
}
}

再填充((

refilldb(String db) async {
Directory devicedir = await getApplicationDocumentsDirectory();
var workerpath = join(devicedir.path + "/db/" + db + "_worker.hive");
var statpath = join(devicedir.path + "/db/" + db + ".hive");
if (File(workerpath).existsSync() == false) {
new File(workerpath).create(recursive: true);
}
await File(statpath).copy(workerpath);
}

更新代码

class _StarterCardState extends State<StarterCard> {
String contentString = "";
String tempString = "";
String tempString1 = "";
List randplayers = [];
String player1 = "";
String player2 = "";
String player3 = "";
Box db = Hive.box<CardFields>("starter_worker");
Future<dynamic> dbCheck(Box db) async {
if (db.isEmpty) {
await refilldb("starter");
}
}
@override
Widget build(BuildContext context) {
int currentcardindex = randomcard(db);
CardFields currentCard = db.getAt(currentcardindex);
randplayers = players;
randplayers.shuffle();
player1 = randplayers.elementAt(0);
player2 = randplayers.elementAt(1);
player3 = randplayers.elementAt(2);
if (currentCard.content.contains("$player1")) {
tempString = currentCard.content.replaceAll("$player1", "$player1");
tempString1 = tempString.replaceAll("$player2", "$player2");
contentString = tempString1.replaceAll("$player3", "$player3");
} else {
contentString = currentCard.content;
}
db.deleteAt(currentcardindex);
return FutureBuilder<dynamic>(
future: dbCheck(db),
initialData: "Loading...",
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
}
if (snapshot.connectionState == ConnectionState.done) {
return Expanded(
flex: 1,
child: Container(
width: double.infinity,
color: Colors.blueAccent,
child: Column(
children: [
Text("$contentString"),
],
),
),
);
}
return Container();
});
}
}

您应该尝试等待您的dbcheck函数。

await dbcheck(db);

"太快了";不可能是开发人员面临的问题。。您必须等待异步方法和调用。。

在构建方法中,您必须使用FutureBuilder来等待函数的执行。在构建器中,你可以检查数据的状态,这样你就可以在数据准备好之前显示一个加载小部件

最新更新