美文网首页
Flutter 性能优化2

Flutter 性能优化2

作者: 果果人8023 | 来源:发表于2019-07-16 13:48 被阅读0次

仅适用于一次数据更新,例如:在initState加载异步数据

flutter在布局中,我们除了无状态小部件还有有状态小部件,每次需要修改有状态小部件时都需要setState,setState以后,StatefulWidget的build方法就会被调用,然而在build中,有些小部件跟修改的参数并没有什么关系,它以为在build中,也会跟着build的重新构建跟随这构建,这个时候我们可以使用FutureBuilder

正常代码

import 'package:flutter/material.dart';

class StatePage extends StatefulWidget {
  @override
  StatePageState createState() => new StatePageState();
}

class StatePageState extends State<StatePage> {
  int count;

  @override
  Widget build(BuildContext context) {
    print('test StatePageState build');
    return Scaffold(
        appBar: AppBar(
          title: Text('statePage', style: TextStyle(fontSize: 16)),
          centerTitle: true,
        ),
        body: Align(
          child: Column(
            children: <Widget>[
              Text("this count:$count"),
              RaisedButton(
                child: Text('add'),
                onPressed: add,
              ),
            ],
          ),
        ));
  }

  void add() {
    setState(() {
      count += 1;
    });
  }
}

每次RaisedButton 点击调用add更新count值后,build方法都会被重新构建。

当使用FutureBuilder以后。

import 'package:flutter/material.dart';

class StatePage extends StatefulWidget {
  @override
  StatePageState createState() => new StatePageState();
}

class StatePageState extends State<StatePage> {
  @override
  Widget build(BuildContext context) {
    print('test StatePageState build');
    return Scaffold(
        appBar: AppBar(
          title: Text('statPage', style: TextStyle(fontSize: 16)),
          centerTitle: true,
        ),
        body: Align(
          child: Column(
            children: <Widget>[
              FutureBuilder(
                future: countFuture(),
                builder: (context, snapshot) {
                  print('test FutureBuilder builder');
                  return Text("this number:${snapshot.data}");
                },
              ),
            ],
          ),
        ));
  }

  Future countFuture() async {
    await Future.delayed(Duration(seconds: 2));
    return Future.value(1000);
  }
}

第一次构建的时候,会打印两个内容

I/flutter (28440): test StatePageState build
I/flutter (28440): test FutureBuilder builder

然后FutureBuilder 会执行countFuture()方法,单countFuture返回future以后,页面会重新调用FutureBuilder中的builder重新构建builder中的小部件,而不会在执行StatePageState中的build方法
第二次打印内容

//第一次
I/flutter (28440): test StatePageState build
I/flutter (28440): test FutureBuilder builder
//第二次
I/flutter (28440): test FutureBuilder builder

原理:FutureBuilder内部继承了StatefulWidget,当widget.future 有值的时候执行 setState更新FutureBuilder视图

 void _subscribe() {
    ...
    widget.future.then<void>((T data) {
        if (_activeCallbackIdentity == callbackIdentity) {
          setState(() {
            _snapshot = AsyncSnapshot<T>.withData(ConnectionState.done, data);
          });
        }
      }, onError: (Object error) {
        if (_activeCallbackIdentity == callbackIdentity) {
          setState(() {
            _snapshot = AsyncSnapshot<T>.withError(ConnectionState.done, error);
          });
        }
      });
    ...
  }

相关文章

  • Flutter优化相关

    Flutter之禅 内存优化篇Flutter ImageCacheFlutter 性能优化 Tips

  • Flutter 性能优化2

    仅适用于一次数据更新,例如:在initState加载异步数据 flutter在布局中,我们除了无状态小部件还有有状...

  • Flutter相关优化

    性能优化 1、内存优化使用flutter performance等工具查看内存和帧率使用DevTools来gc查看...

  • 2017.11.10性能优化

    性能优化 1 稳定 2 扩展 3 性能 1 网络性能 2 执行性能 网络性能 网络性能优化 面向对象的...

  • flutter 性能优化

    中文文档:https://flutter.cn/docs/testing/best-practices英文文档:h...

  • Flutter性能优化

    1.圆角对性能的影响尽量避免用Clipxxx组件,建议用BoxDecoration的image属性实现,如果用Cl...

  • MS(4):Android之性能优化篇

    六、性能及优化 1、App优化之性能分析工具 Android App优化之性能分析工具 2、ListView优化 ...

  • Android 性能优化

    Android性能优化典范 - 第1季 Android性能优化典范 - 第2季 Android性能优化典范 - 第...

  • 我花了5个通宵刷的Java面试PDF,成功拿下心仪公司offer

    性能优化面试专栏 1. 1 tomcat性能优化整理 1. 2 JVM性能优化整理 1. 3 Mysq1性能优化整...

  • 性能优化与面向对象

    一、性能优化 1、网络性能 a、网络性能优化 2、执行性能 二、面向对象(OOP) 1、对象由什么组成? 2、创建...

网友评论

      本文标题:Flutter 性能优化2

      本文链接:https://www.haomeiwen.com/subject/pnezkctx.html