async

FutureBuilder

1
2
3
4
5
6
7
8
9
10
11
FutureBuilder({
this.future, //通常是一个异步耗时任务
this.initialData,//初始数据
required this.builder,//Widget构造器,该builder会在Future执行的不同阶段被调用多次
})

final AsyncWidgetBuilder<T> builder;

//snapshot包含当前异步任务的状态信息及结果
typedef AsyncWidgetBuilder<T> = Widget Function(BuildContext context, AsyncSnapshot<T> snapshot);

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40


Widget build(BuildContext context) {
return Center(
child: FutureBuilder<String>(
future: mockNetworkData(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
// 请求已结束
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
// 请求失败,显示错误
return Text("Error: ${snapshot.error}");
} else {
// 请求成功,显示数据
return Text("Contents: ${snapshot.data}");
}
} else {
// 请求未结束,显示loading
return CircularProgressIndicator();
}
},
),
);
}

enum ConnectionState {
/// 当前没有异步任务,比如[FutureBuilder]的[future]为null时
none,

/// 异步任务处于等待状态
waiting,

/// Stream处于激活状态(流上已经有数据传递了),对于FutureBuilder没有该状态。
active,

/// 异步任务已经终止.
done,
}


Read More

Flutter插件

Flutter只是一个UI框架,运行在宿主平台上,Flutter本身无法提供一些系统能力,比如蓝牙、相机、GPS等。插件是一种特殊的包,和纯dart包的主要区别是插件中除了dart代码,还包括特定平台的代码。

插件实现原理

Flutter提供了平台通道(platform channel)用于Flutter和原生平台的通信,通信本质上是一个远程调用(RPC),通过消息传递实现:

  • 应用的Flutter部分通过平台通道将调用消息发送到宿主
  • 宿主监听平台通道,并接收改消息。然后调用平台API,并将响应发送回Flutter
Read More

Flutter项目结构

文件夹目录

最基础的helloworld项目结构如下:

  • .dart_tool:记录了一些dart工具库所在的位置和信息
  • .idea:android studio 是基于idea开发的,.idea 记录了项目的一些文件的变更记录
  • android:Android项目文件夹
Read More