Flutter知识点记录

问题

dart的单线程模式怎么保证不阻塞UI的

Dart的线程模型是什么样子的,

State的生命周期到底是什么样子的呢,单独的设置某个地方的状态变化怎么办呢,大名鼎鼎的 redux 是一个怎么样的库,在你现在的开发中哪里能用到呢?

Widget是啥,里面的key字段有什么用处?Element又是个啥?

Widget

Widget并不等于View,在Flutter当中,Widget是用来描述UI的不可变数据结构。
先看源码:

@immutable
abstract class Widget extends DiagnosticableTree {
  const Widget({ this.key });

  final Key key;

  @protected
  Element createElement();

  @override
  String toStringShort() {
    return key == null ? '$runtimeType' : '$runtimeType-$key';
  }

  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    super.debugFillProperties(properties);
    properties.defaultDiagnosticsTreeStyle = DiagnosticsTreeStyle.dense;
  }

  static bool canUpdate(Widget oldWidget, Widget newWidget) {
    return oldWidget.runtimeType == newWidget.runtimeType
        && oldWidget.key == newWidget.key;
  }
}

首先看顶部的注解:@immutable,这就表明Widget是不可变的,所以Widget没有任何可变的状态,所有的字段都应该是final。再来看下里面的canUpdate方法:

  static bool canUpdate(Widget oldWidget, Widget newWidget) {
    return oldWidget.runtimeType == newWidget.runtimeType
        && oldWidget.key == newWidget.key;
  }

源码中只提供了key这个字段,Flutter当中key用来控制Element树当中新旧Widget的替换。Flutter通过canUpdate判断,如果两个Widget的runtimeType及key都是相等的,其所对应的Element就会用新的Widget替换旧的Widget(通过调用Element.update,传递新的Widget),否则,旧的Element要从树中移除,新的Element要添加到树当中。

Flutter提供的容器类WidgetStatelessWidgetStatefullWidget,这两者可以管理一组Widget.

StatelessWidget

StatelessWidget是无状态的Widget。StatelessWidget提供了build方法,通过build方法构建一组Widget来更具体地描述UI的一部分。整个Widget树的构建过程是递归的,直到生成一棵完整具体的UI描述树。框架会用build方法生成的一组widgets替换(更新或者删除)该widget自己的子树,

abstract class StatelessWidget extends Widget {
  const StatelessWidget({ Key key }) : super(key: key);

  @override
  StatelessElement createElement() => StatelessElement(this);

  @protected
  Widget build(BuildContext context);

}

在看一下上面的源码,该部分UI的描述完全可以由该Widget自己的配置信息及构建上下文(BuildContext,即该Widget自己对应的Element)描述,不依赖其它任何外部信息。所以它是无状态的

build方法的调用有三种时机

  • StatelessWidget第一次插入到树中时(其所对应的Element首次插入到Element树中时)
  • 父对象改变了StatelessWidget的配置
  • 依赖的InheritedWidget发生改变

Flutter的绘制流程是什么样子的

编译后的产物中,Release和Debug模式下,文件有哪些区别,有差别的那些文件的作用有是啥呢?

你可能感兴趣的:(Flutter知识点记录)