flutter InheritedWidget使用方法總結
引言
InheritedWidget,flutter中非常重要的一個功能組件。比如我們在應用的根 widget 中通過InheritedWidget共享了一個數(shù)據(jù),那么我們便可以在任意子 widget 中來獲取該共享的數(shù)據(jù)。
didChangeDependencies
說到 InheritedWidget ,我們不得不聊聊 state 對象中的 didChangeDependencies 方法。當子控件依賴使用了父控件中的 InheritedWidget,比如主題、locale(語言)等發(fā)生變化時,依賴其的子 widget 的didChangeDependencies方法將會被調(diào)用。
一般來說,子 widget 很少會重寫此方法,因為在依賴改變后 framework 也都會調(diào)用build()方法。但是,如果你需要在依賴改變后執(zhí)行一些昂貴的操作,比如網(wǎng)絡請求,這時最好的方式就是在此方法中執(zhí)行,這樣可以避免每次build()都執(zhí)行這些昂貴操作。
重點: 如子控件build 方法中沒有使用 InheritedShareWidget 的數(shù)據(jù),那么它的didChangeDependencies將不會被調(diào)用
如何使用?
我們簡單用一個 count 自增的例子來記錄 InheritedWidget 的使用:
- 新建 InheritedShareWidget 繼承 InheritedWidget 作為共享數(shù)據(jù)源,以其為父節(jié)點提供子節(jié)點數(shù)據(jù)
import 'package:flutter/material.dart';
class InheritedShareWidget extends InheritedWidget {
//用于共享的數(shù)據(jù)
final int data;
InheritedShareWidget({this.data, Widget child}) : super(child: child);
//定義便捷方法,方便子控件獲取共享數(shù)據(jù)
static InheritedShareWidget of(BuildContext context) {
///當子控件依賴使用了我們的數(shù)據(jù)源時,數(shù)據(jù)變動會觸發(fā)子控件中的 didChangeDependencies 方法
return context.dependOnInheritedWidgetOfExactType<InheritedShareWidget>();
///(前提:子控件使用了數(shù)據(jù)源)子控件中的 didChangeDependencies 方法不會被觸發(fā)
// return context.getElementForInheritedWidgetOfExactType<InheritedShareWidget>().widget;
}
@override
bool updateShouldNotify(covariant InheritedShareWidget oldWidget) {
//返回true時,才會通知子控件
return oldWidget.data != this.data;
}
}
注意:updateShouldNotify方法中,通知指的是通知子控件的didChangeDependencies 方法,前提是子控件使用dependOnInheritedWidgetOfExactType 的方式獲取共享數(shù)據(jù)。
- 子節(jié)點中如何獲取共享數(shù)據(jù)?
class TestShareChildWidget extends StatefulWidget {
const TestShareChildWidget({Key key}) : super(key: key);
@override
_TestShareChildWidgetState createState() => _TestShareChildWidgetState();
}
class _TestShareChildWidgetState extends State<TestShareChildWidget> {
@override
void didChangeDependencies() {
///如build 方法中沒有使用 InheritedShareWidget 的數(shù)據(jù),那么它的didChangeDependencies()將不會被調(diào)用
super.didChangeDependencies();
print("enter didChangeDependencies");
}
@override
Widget build(BuildContext context) {
print("enter child build");
//獲取Inherited的共享數(shù)據(jù):
final data = InheritedShareWidget.of(context).data.toString();
return Text(data);
}
}
- 兩者通過父子嵌套的關系聯(lián)系在一起:
class _TestInheritedWidgetState extends State<TestInheritedWidget> {
int count = 0;
@override
Widget build(BuildContext context) {
return Center(
child: InheritedShareWidget(
data: count,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TestShareChildWidget(),
RaisedButton(
child: Text('add'),
onPressed: () {
setState(() {
++count;
});
})
],
),
),
);
}
}
大家注意到,demo中操作++count時,使用了setState手動觸發(fā)控件進行刷新。
結論
InheritedWidget只提供我們共享數(shù)據(jù)的能力,以及控制是否在 build 前觸發(fā)didChangeDependencies 的能力。不會主動觸發(fā)build方法,如果build沒被觸發(fā),那么didChangeDependencies 也不會被觸發(fā)。
號外擴展
InheritedWidget 數(shù)據(jù)共享能力不會受到 Navigator push 新頁面的影響,與原生不一樣,flutter的頁面跳轉(zhuǎn)不是管理一個堆棧,Navigator 本質(zhì)上是使用 overlay 管理一個 stack widget,因此 InheritedWidget 基于父子關系管理的數(shù)據(jù)共享條件沒有被打破
以上就是flutter InheritedWidget使用方法總結的詳細內(nèi)容,更多關于flutter InheritedWidget使用的資料請關注腳本之家其它相關文章!
相關文章
Android 滑動Scrollview標題欄漸變效果(仿京東toolbar)
這篇文章主要介紹了Android 滑動Scrollview標題欄漸變效果(仿京東toolbar),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
android開發(fā)教程之textview內(nèi)容超出屏幕寬度顯示省略號
android開發(fā)中用textview顯示內(nèi)容時,顯示內(nèi)容過多可能會折行或顯示不全,那樣效果很不好,我們可以用省略號顯示,下面看設置方法2014-02-02
Flutter版本的自定義短信驗證碼實現(xiàn)示例解析
這篇文章主要介紹了Flutter版本的自定義短信驗證碼實現(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08
Android scheme 跳轉(zhuǎn)的設計與實現(xiàn)詳解
這篇文章主要介紹了Android scheme 跳轉(zhuǎn)的設計與實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
基于Android 監(jiān)聽ContentProvider 中數(shù)據(jù)變化的相關介紹
本篇文章小編為大家介紹,基于Android 監(jiān)聽ContentProvider 中數(shù)據(jù)變化的相關介紹。需要的朋友參考下2013-04-04
Android ListView滾動到底后自動加載數(shù)據(jù)
這篇文章主要為大家詳細介紹了Android之ListView滾動到底后自動加載數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09

