Flutter--状态管理机制

简介

  • Flutter的一些组件我们用了三天左右有了部分了解,在日后的工作学习中使用到了,我们可以再进行深入了解。平时我们呢使用的数据是动态的,所以我们在了解组件的同时,我们还需要对状态管理机制有一些了解

Widget唯一标识

  • 在Flutter中,每个Widget都有一个唯一标识key,它在FrameWork层创建和渲染时生成,可以通过 GlobalKey、LocalKey、UniqueKey和ObjectKey对Widget的key进行保存
GlobalKey myKey = new GlobalKey();
@override
Widget build(BuildContext context) {
    return new MyWidget(
        key : myKey
    );
 }

InheritedWidget

  • 它是一个被定义为父节点的Widget,其暴露出来的数据,可以高效的在Widget树从上到下传递和共享,同时支持跨级数据传递

Widget树

  • Widget之间存在的嵌套层级形成了Widget树,Widget只是描述Element的数据配置,真正在屏幕上呈现给用户的UI是Element
  • 在这里插入图片描述

Context

  • Context对应Widget中具体某一个Widget的位置引用,父Widget的Context包含子Widget的Context,通过Context可以便利和查找当前Widget树,Context之间也是关联在在一起的,他们也可以组成和Widget树类似的Context树
  • 在这里插入图片描述

StatelessWidget

  • StatelessWidget即无状态的Widget,它无法通过setState设置组件状态进行重绘,它内的属性应该被声明为final,防止改变
生命周期

初始化->build进行渲染

StatefulWidget

  • StatefulWidget是有状态的Widget,创建一个StatefulWidget组件时,它同时创建一个State对象,通过与State关联可以达到刷新UI的目的
组成:
  • 主体部分:
class HttpPage extends StatefulWidget {
  HttpPage({Key key}) : super(key: key);
  _HttpPageState createState() => _HttpPageState();
}
  • 第二部分
class _HttpPageState extends State<HttpPage> {
     @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return ...

State

  • 在Flutter中,Widget和State具有不同的生命周期: Widget是临时对象,用于构建当前状态下的应用程序,而State对象在多次调用build()之间保持不变,允许它们保存信息(状态)

State生命周期

在这里插入图片描述


class MyLifePage extends StatefulWidget {
  @override
  _MyLifePageState createState() => _MyLifePageState();
}


class _MyLifePageState extends State<MyLifePage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print("initState");
  }


  @override
  Widget build(BuildContext context) {
    print("build");
    return Container(
      child: Text("life"),
    );
  }


  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    print("didChangeDependencies");
    super.didChangeDependencies();
  }


  @override
  void reassemble() {
    // TODO: implement reassemble
    print("reassemble");
    super.reassemble();
  }


  @override
  void didUpdateWidget(MyLifePage oldWidget) {
    // TODO: implement didUpdateWidget
    print("didUpdateWidget");
    super.didUpdateWidget(oldWidget);
  }


  @override
  void deactivate() {
    // TODO: implement deactivate
    print("deactivate");
    super.deactivate();
  }


  @override
  void dispose() {
    // TODO: implement dispose
    print("dispose");
    super.dispose();
  }
}
  • 首次启动界面:

    • initState -> didChangeDependencies -> build
  • 首次启动后点击热重载

    • reassemble -> didUpdateWidget -> build
  • 退出界面

    • deactivate -> dispose
  • A跳转至其他页面B

    • B : initState -> didChangeDependencies -> build
    • A: deactivate -> build
initState
  • initState是State生命周期中第一个被执行的方法,且在生命周期中只会被执行一次, 注意此时FrameWork层还未把Context和State关联在一起,不可访问Context
didChangeDeoendencies
  • 该方法在执行完initState后被执行,此时可以访问Context
build
  • build方法在didChangeDependencies和didUpdateWidget之后被执行,每当界面重绘调用setState的时候都会被执行
dispose
  • 该方法在组件被销毁的时候调用
发布了175 篇原创文章 · 获赞 56 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39424143/article/details/104801132