- 作者:老汪软件技巧
- 发表时间:2023-12-25 08:00
- 浏览量:
开发实战-使用异步数据更新
在开发过程中,经常遇到需要依赖异步数据更新的情况,如下载图片后显示,获取到某个数据时候,显示在对应的UI界面上,都可以使用异步数据更新。
一、
是一个,该基于与]交互的最新快照构建的。
/// Creates a widget that builds itself based on the latest snapshot of
/// interaction with a [Future].
///
/// The [builder] must not be null.
const FutureBuilder({
super.key,
this.future,
this.initialData,
required this.builder,
}) : assert(builder != null);
其中
二、使用
这里使用的示例,我是通过加载网页时候,需要将中设置,中需要设置token。token需要获取到再设置到中的中。
获取token
Future _getToken() async {
final token = (await SessionDataService.sessionData)?.token;
if (token == null) return null;
return token;
}
使用用来在获取token后更新,先判断.是否有数据。如果有数据,则直接显示,如果没有数据,则显示默认的。
FutureBuilder(
future: _getToken(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
final token = snapshot.data;
if (token == null) return Container();
return WebView(
javascriptMode: JavascriptMode.unrestricted,
initialUrl: url,
initialCookies: [
WebViewCookie(
name: "auth", value: "token", domain: "inice.cn"),
],
userAgent: "inice.cn",
onWebViewCreated: (controller) {
cookieManager.setCookies([
Cookie('auth', token)
..domain = 'inice.cn'
..httpOnly = false,
]);
webController = controller;
},
);
}
return Container();
},
),
完整代码如下
class WebViewScreen extends StatelessWidget {
WebViewScreen({Key? key, required this.url}) : super(key: key);
final String url;
WebViewController? webController;
final cookieManager = WebviewCookieManager();
Future _getToken() async {
// final token = (await SessionDataService.sessionData)?.token;
final token = ApiAuth().token;
if (token == null) return null;
return token;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
Container(
color: Colors.amber,
),
SafeArea(
bottom: false,
child: FutureBuilder(
future: _getToken(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
final token = snapshot.data;
if (token == null) return Container();
return WebView(
javascriptMode: JavascriptMode.unrestricted,
initialUrl: url,
initialCookies: [
WebViewCookie(
name: "auth", value: "token", domain: "inice.cn"),
],
userAgent: "inice.cn",
onWebViewCreated: (controller) {
cookieManager.setCookies([
Cookie('auth', token)
..domain = 'inice.cn'
..httpOnly = false,
]);
webController = controller;
},
);
}
return Container();
},
),
),
],
),
);
}
}
三、小结
开发实战-使用异步数据更新。描述可能不是特别准确,请见谅。
学习记录,每天不停进步。