flutter 常见问题

1.pageview,遇到列表点击进入详情后回来,列表重新加载了.

class _MovieListPageState extends State<MovieListPage>
//重点:
    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<dynamic>无法转换为 List<xxbean>,xxbean是你的实体.

在使用的地方,全部加上<xxbean>,不只是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<dynamic, String>(_parseAndDecode, text);
  //return compute(_parseAndDecode, text);
}

上面的compute就可以了,不过如果产生大量的isolate,不利于内存,所以:
Future<LoadBalancer> loadBalancer = LoadBalancer.create(2, IsolateRunner.spawn);

Future<dynamic> loadWithBalancer<R, T>(Function function, T data) async {
  final lb = await loadBalancer;
  return await lb.run<dynamic, T>(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<DateProvider, DateTime>(
                  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.图片外包一层以后,性能提升明显.

 

 

 

 

待补充.

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值