flutter 知识点(三)

137 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情

什么是Navigator?MaterialApp做了什么

Navigator是在Flutter中负责管理维护页⾯堆栈的导航器。MaterialApp在需要的时候,会⾃动为我们创建Navigator。

Navigator.of(context),会使⽤context来向上遍历Element树,找到MaterialApp提供的_NavigatorState再调⽤其push/pop⽅法完成导航操作。

讲讲Flutter中的的Key

  • Key是Widgets、Elements、SemanticsNodes的标识符
  • 如果新部件的键与与该元素相关联的当前部件的键相同,则新部件才用于更新现有元素。
  • 在父元素相同的元素中,key必须是唯一的

Key 派生出两种不同用途的Key:LocalKey 和 GlobalKey。Key的子类应该是LocalKey或GlobalKey的子类。

LocalKey 直接继承至 Key,它应用于拥有相同父 widget 的小部件进行比较的情况,比如一个widget有多个子 Widget,需要对它的子 widget 进行移动处理时,应该使用Localkey。

  • Localkey 派生出了许多子类 key:
    • ValueKey : ValueKey('String')

      Valuekey 又派生出了 PageStorageKey

    • ObjectKey : ObjectKey(Object)

    • UniqueKey : UniqueKey()

  • GlobalKey在整个应用程序中必须是唯一的。

widget 的 diff 更新机制

Widget 有 Stateful 和 Stateless 两种,两种widget构造函数中都有一个可选的参数Key,key是widget的标识符且能够帮助开发者在 Widget tree 中保存状态。

当新的 Widget 到来时将会调用 canUpdate 方法,来确定这个 Element是否需要更新,Widget 只是一个配置且无法修改,而 Element 才是真正被使用的对象,并可以被修改。canUpdate 对两个(新老) Widget 的 runtimeType 和 key 进行比较,从而判断出当前的 Element 是否需要更新。若 canUpdate 方法返回 true 说明不需要替换 Element,直接更新 Widget 就可以了。

Future和Isolate有什么区别

future是异步编程,调⽤本⾝⽴即返回,并在稍后的某个时候执⾏完成时再获得返回结果。在普通代码中可以使⽤await 等待⼀个异步调⽤结束。

isolate是并发编程,Dart没有并发时的共享状态,所有Dart代码都在isolate中运⾏,包括最初的main()。每个isolate都有它⾃⼰的堆内存,意味着其中所有内存数据,包括全局数据,都仅对该isolate可见,它们之间的通信只能通过传递消息的机制完成,消息则通过端⼝(port)收发。

isolate只是⼀个概念,具体取决于如何实现,⽐如在Dart VM中⼀个isolate可能会是⼀个线程,在Web中可能会是⼀个Web Worker。

Stream与future是什么关系

Stream 和 Future 是 Dart 异步处理的核⼼ API。Future 表⽰稍后获得的⼀个数据,所有异步的操作的返回值都⽤ Future 来表⽰。但是Future 只能表⽰⼀次异步获得的数据。⽽ Stream 表⽰多次异步获得的数据。⽐如界⾯上的按钮可能会被⽤户点击多次,所以按钮上的点击事件(onClick)就是⼀个 Stream 。

简单地说,Future将返回⼀个值,⽽Stream将返回多次值。Dart 中统⼀使⽤ Stream 处理异步事件流。Stream 和⼀般的集合类似,都是⼀组数据,只不过⼀个是异步推送,⼀个是同步拉取。

await for如何使用

await for是不断获取stream流中的数据,然后执⾏循环体中的操作。它⼀般⽤在直到stream什么时候完成,并且必须等待传递完成之后才能使⽤,不然就会⼀直阻塞。