首先明确一点,Dart语言是单线程模型,没有信号量
,但是有类似信号的实现Completer
起因
在学习Flutter,在学习Dart。我的学习方式不是那种系统性学习,而是在实践中学习,理论总是要实践,于是自己给自己制造场景。
我自己用Flutter开发一个工具应用,在线/离线查数据表。这个工具应用开发所需常见技能:网络、文件、数据库、UI交互。
扯远了,先说一个场景,应用启动后要打开数据库,并且随时可能出现增删改查的操作
- A 、应用启动后,我用sqflite打开数据库(异步操作)
- B 、应用启动后,首页是历史数据列表,触发数据库查询操作(异步操作)
问题来了,A,B都是异步操作,其触发顺序不固定、操作结果都是Futurer
,如何保证A、B的逻辑顺序----打开数据库完毕,然后查询数据库 ?
过程 (使用Future)
Future
是未来操作的输出,直白的说就是一个结果,但是这个结果来自可能还没有执行的任务,也就是说这个结果未必立即有效。
把数据库操作的那个例子简化为示意代码:
import 'package:sqflite/sqflite.dart';
import 'dart:async';
//数据库句柄
Database g_db = null;
//打开数据库
void openDb() async
{
g_db = await openDatabase( "数据库路径",
onCreate:(Database db, int version) aysnc {
await db.execute('CREATE TABLE Offline xxxxx)');
},
version: 1,
);
}
//查询数据库
List queryDb() async
{
List result = await g_db.query("Offline