[Week 3] Flutter - InheritedWidget 介绍

当我们与 UI (使用者介面)互动时,会改变资料,进而有储存资料的需求。

这时候要考虑一些事情:

这些资料要短暂的储存、还是要存放久一点?
我们会先把状态分类成 Ephemeral state (短暂状态)、App state (应用状态)。
Ephemeral state 的例子有:PageView 的当下页面、複杂动画的进度、BottomNavigationBar 当下选定的 item 等等。

App state 的例子有:使用者偏好、登入资讯、社交软体的通知、电商软体的购物车、新闻软体的文章已读/未读状态等等。

当 App 的规模层次愈来愈複杂,有很多 Widget,资料要如何在这些 Widget 间传递?
第 2 点便是本文要讨论之处。

先想像一个场景,当 Widget 数量一多,我们要传递资料时可以透过建构子,接续往 子 Widget 作资料传递。这样看下来似乎有点蠢(我是指:没效率)。

我想要在树根 Widget 可以立刻拿到树顶资料,那要如何做呢?
InheritedWidget 便是拿来解决这项痛点的工具。
你可以在 InheritedWidget 底下的任何 Widget 拿到对 InheritedWidget 的引用。

更清楚地说,这不是在 class 层级的继承,而是在 Widget 层级的继承。

InheritedWidget 如果在整个 App 生命週期没有变化,是被允许的。
但是,如果某东西是 final,根本上来说只代表它无法被重新赋值(reassigned)。
并不意味着它不能在内部被更改!

举例来说,相较于 value,你可以将一个 service 物件附着在 InheritedWidget。变成资料库(database) 的封装(wrapper)、网路 API 的代理,又或是 assets 的提供者(provider)。

实作上,我们可以利用 InheritedSomething.of(context).service 来让 InheritedWidget 的子 Widget 能够很方便地取得封装对象(本例为 service)。或是利用 InheritedSomething.of(context).service.blow() 来方便取得 InheritedWidget 定义的方法。甚至是订阅一个资料流(stream)。

小结,我们可以利用 InheritedWidget 来取得树顶(父层)的 App state。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章