Flutter 初始化数据完成后再加载页面
一、初始化数据完成后再加载数据
1、为了达成这个目标尝试了多种方法总是失败
在Init 和didChangeDependencies
初始化数据过也不行
@override
void didChangeDependencies() {
//getcplist();
WidgetsBinding.instance.addPostFrameCallback((tim) {
getcplist();
});
super.didChangeDependencies();
}
尝试使用FutureBuilder 来解决问题,但是要解决FutureBuilder 当调用setstate的时候,将会刷新整个FutureBuilder,结果会是重新请求数据,造成了不必要的请求和资源浪费。
正确的代码如下
class CppageState extends State<Cppage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: Consumer<CouponProvider>(builder: (context,CouponProvider cplst,Child) {
return Column(
children: <Widget>[
Container(
padding: EdgeInsets.only(top: 5.0,bottom: ),
child: ShowpayWidget(),),
Expanded(
child:
FutureBuilder(
future: _futureBuilderFuture,
builder: (BuildContext context, AsyncSnapshot snapShot)
{
if (snapShot.connectionState== ConnectionState.waiting)
{
return Center(child: Text('Data is Loading...'),);
} else if (snapShot.connectionState == ConnectionState.done) {
print(snapShot.hasError);
print('data:${snapShot.data}');}
if (snapShot.hasError) {
return Text('Error: ${snapShot.error}');
}
return GridView.builder(
shrinkWrap: true,
itemCount: cplst.couponlst.bfcrmResp.voucherList.length,
// physics: NeverScrollableScrollPhysics(),//禁止滚动
padding: EdgeInsets.symmetric(horizontal: ),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: ,
mainAxisSpacing: ,
crossAxisSpacing: ,
childAspectRatio: ,
),
itemBuilder: (context, index) {
return Cpitem(cplst.couponlst.bfcrmResp.voucherList[index]);
},
);
}
)
)
],
);
// );
})
);
}
Future getcplist() async
{
print('xxxxxxxxxxx');
await Provider.of<CouponProvider>(context,listen: false).getCouponlist();
}
var _futureBuilderFuture;
@override
void initState() {
print('');
_futureBuilderFuture =getcplist();
super.initState();
}
二、多网络请求时
其中getDelegationData ,getData是两个单独的网络请求,写法如下
Future getData() async {
var data = {
'iReq': "BTC_USDT",
};
TradeInfo response = await TradeService.getData(this, data.toString());
}
getDelegationData一样,不再给出,这样的话等两个请求都结束之后会返回一个新的Future到我们的FutureBuilder
if (snapShot.connectionState == ConnectionState.waiting) {
return Text('Loading...');
} else if (snapShot.connectionState == ConnectionState.done) {
print(snapShot.hasError);
print('data:${snapShot.data}');
if (snapShot.hasError) {
return Text('Error: ${snapShot.error}');
}
这里的话就用到了snapShot的几种状态,用来判断网络请求处于哪一个阶段,等待(请求中),done完成,包括如果请求有异常的话,我们可以打印出来 return Text(‘Error: ${snapShot.error}’);
注意事项:
这里有一个情况就是我们在调用Future.wait([getDelegationData(), getData()]);的时候,请求网络的顺序是按参数的先后顺序执行的,先走getDelegationData请求,再走getData,但是返回数据结果的顺序却不能保证,因为是根据请求需要的时间决定的,异步的,所以我们尽量把数据处理放在ConnectionState.done之后再处理。
多网络请求如何控制顺序:
另外如果你的网络请求有逻辑关系,比如第一个接口的返回值要当做第二个接口的请求参数,那么写法如下
Future testThen2() asyn {
Future getDatas() async {
return getDelegationData().then((e){
getData();
});
}
// 请求顺序是从外层到里层即 getDatas=====getDelegationData===getData
详转自于:https://blog.csdn.net/u013095264/article/details/99977917#_43
Flutter 初始化数据完成后再加载页面的更多相关文章
- .js控制一次加载一张图片,加载完后再加载下一张
js怎么控制一次加载一张图片,加载完后再加载下一张 (1)方法1 (1)方法2
- ant design pro解决初始加载,有顺序的请求/请求顺序报错问题/登录后再加载其他数据/异步的顺序问题/偷跑
方法是:如在Authorized.jsx中解决,当未登录成功(包括登录失败和登录验证中),就显示loading,否则继续 加载渲染children 一个三目运算或者if分支就可以解决,但是要写到最先加 ...
- jquery循环延迟加载,用于在图片加载完成后再加载js
<html> <head> <script type="text/javascript" src="http://lib.sinaapp.c ...
- 网页图片很多时,加载完后再加载图片(defer:延迟加载)
图片影响页面加载速度,可以先加载完页面,再去加载图片. defer:告诉浏览器,这里面的js代码不影响网页脚本解析,可以解析完html脚本再执行这段js代码(个人理解). 网页代码:<img s ...
- 如何在AngularJS渲染后再加载JS
http://www.itnose.net/detail/6100484.html app.directive('repeatDone', function () { return function ...
- flutter 入口文件配置路由+加载页面
入口文件配置路由 1.路由信息 -- 加载页面 ,通常用于显示新的内容或者广告,加载完成之后进入主页面 -- 主页面 /app 2.配置页面 main.dart main.dart // main ...
- DataTable 删除数据后重新加载
DataTable 删除数据后重新加载 一.总结 一句话总结: 判断datatable是否被datatable初始化或者是否执行了datatable销毁函数,如果没有,就销毁它 if ($('#dat ...
- 精尽MyBatis源码分析 - MyBatis初始化(二)之加载Mapper接口与XML映射文件
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- 爬虫再探实战(三)———爬取动态加载页面——selenium
自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的 ...
随机推荐
- 在订单服务中使用Hystrix进行熔断设置
使用Hystrix熔断(上) 在一个分布式系统里,一个服务依赖多个服务,可能存在某个服务调用失败, 比如超时.异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败, ...
- python学习-21 集合 2
集合的其他方法 1.交差补集 math = {'xm','xh','xg','xx'} english ={'xm','xh','dm','john'} print(math.symmetric_di ...
- Image splicing forgery detection combining coarse to refined convolutional neural network and adaptive clustering
粗到精的卷积神经网络与自适应聚类相结合的图像拼接篡改检测 研究方向:图像篡改检测 论文出处:ELSEVIER A类 学校:西安电子科技大学网络工程学院.重庆邮电大学计算机科学与技术学院 关键字:Spl ...
- asp.net core-6.Bind读取配置文件到C#实例中
1,创建asp.net core web应用程序,选择空网站 2,创建一个appsettings.json文件 为什么要叫appsettings.json呢?因为在Iwebhost启动的时候没有添加任 ...
- MySQL5.7主从同步配置
主从同步,将主服务器(master)上的数据复制到从服务器(slave). 应用场景 读写分离,提高查询访问性能,有效减少主数据库访问压力. 实时灾备,主数据库出现故障时,可快速切换到从数据库. 数据 ...
- c# winfrom 子窗体分屏显示
参考博客:https://blog.csdn.net/kailan818/article/details/8517126 实现代码: private void button1_Click(object ...
- sftp配置多个用户权限的问题
groupadd group1 chmod 0755 /test/useradd -g group1 -d /test/backend/ -M test_backendusermod -s /sbin ...
- JDBC 复习3 存取Oracle大数据 clob blob
1 目录结构记得导包咯 mysql oracle 2 代码,DBUtil工具类见前面的随笔博文 package dbex.mysql; import java.io.BufferedReader; i ...
- friend
#include <iostream> using namespace std; //friend 友元,效率的问题 //get 方法和set方法,是标准封装的结果,friend破坏了这种 ...
- Apache Log View 5.37破解笔记
i春秋作家:Sp4ce 之前说过要分享这个日志分析工具[记一次简单的攻击日志分析]的破解版,在破解的路上踩了几个坑,记录分享下. 0×00程序概述 原程序 大小: 2283672 字节文件版本: 5. ...