1.pageview,遇到列表点击进入详情后回来,列表重新加载了.
class _MovieListPageState extends State
//重点:
with AutomaticKeepAliveClientMixin
@override
bool get wantKeepAlive => true;
光这样还是不够地.
需要在build()方法中,调用
Widget build(BuildContext context) {
super.build(context);
}
这样就可以了
2.如何使用透明的状态栏,android会遇到
main()中加入
if (Platform.isAndroid) {
SystemUiOverlayStyle style = SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
///这是设置状态栏的图标和字体的颜色
///Brightness.light 一般都是显示为白色
///Brightness.dark 一般都是显示为黑色
statusBarIconBrightness: Brightness.light);
SystemChrome.setSystemUIOverlayStyle(style);
}
假如你使用了AppBar,不好意思,需要在AppBar里面设置brightness: Brightness.light.
3.使用pageview+NestedScrollView 写出coordinatelayout的那种收缩效果.
在pageview里面的一个page,使用了scaffold,滚动就冲突了.暂时是不在外面套这个widget.
4.如果出现List
在使用的地方,全部加上
5.dio的使用,dio默认是有转换操作,比如把数据转为json.如果数据量大,可能会耗时太多.
使用isolate来处理.直接用compute或是LoadBalancer都行:
使用dio的地方:
dio.transformer=ATransformer();
转换器:
class ATransformer extends DefaultTransformer {
ATransformer() : super(jsonDecodeCallback: _parseJson);
}
// Must be top-level function
_parseAndDecode(String response) {
return jsonDecode(response);
}
_parseJson(String text) async {
return await loadWithBalancer(_parseAndDecode, text);
//return compute(_parseAndDecode, text);
}
上面的compute就可以了,不过如果产生大量的isolate,不利于内存,所以:
Future loadBalancer = LoadBalancer.create(2, IsolateRunner.spawn);
Future loadWithBalancer(Function function, T data) async {
final lb = await loadBalancer;
return await lb.run(function, data);
}
这样创建isolate的数量就限制了.
6.dio配置证书信任操作
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
(client) {
// config the http client
//client.findProxy = (uri) {
// //proxy all request to localhost:8888
// return "192.168.1.1:8888";
//};
client.badCertificateCallback =
(X509Certificate cert, String host, int port) {
Logger.d("host:$host port:$port");
return true;
};
// you can also create a new HttpClient to dio
// return new HttpClient();
};
7.dio请求时,返回的是json,我想返回text怎么办:
options.responseType = ResponseType.plain
然后把options传入即可.
8.Provider更符合面向对象的使用方式,redux,我是不喜欢.我想更新部分view,怎么办.
3.0以后,提供了Selector,可以更精细地匹配,但它不能在consumer里面用,相当于这两个是互斥的.
Selector(
builder: (_, DateTime data, child) {
print('Text date 1 重绘了。。。。。。。。。。');
return Text('Text date 1 : ${data.toString()}');
},
selector: (_, DateProvider counterProvider) {
return counterProvider.value;
},
shouldRebuild: (DateTime prev, DateTime dt) {
return prev == null || prev.microsecond != dt.microsecond;
},
),
9.android的列表滑动没有惯性,不太顺,可以试下ios的效果
列表控件里添加比如用SmartRefresher的话,就加一个属性physics: BouncingScrollPhysics().
10.好多包下载失败,但我的flutter/android的build.gradle文件已经配置了阿里的仓库.
引用的其它pacakge,找到它的源码,把里面的build.gradle的仓库全添加一遍.如果flutter sdk是下载stable包,那么它是在sdk/.pub-cache, 如果sdk你是用git版本,缓存是在用户根目录下的.pub-cache
11.int,string,double这些默认值全是null,不能像java一样想当然.json的转换是真的弱.
任何对象要使用,有时判空是有必要的.int转double都不能自动处理,接口的数据格式不能变.
12.写了一个列表,但是滑动不流畅,如何优化.
优化列表的性能不外乎是减法,更少的层级,更少的重绘等.
用devtools是可以看到哪里耗时的, 不过我用了以后还是真不太好用.
假如你有加载图片的列表,还有很多文本内容,不如试一下在图片或是会动态变化的widget包套一层RepaintBoundary.图片外包一层以后,性能提升明显.
待补充.