網(wǎng)站首頁 編程語言 正文
引言
InheritedWidget,flutter中非常重要的一個(gè)功能組件。比如我們在應(yīng)用的根 widget 中通過InheritedWidget共享了一個(gè)數(shù)據(jù),那么我們便可以在任意子 widget 中來獲取該共享的數(shù)據(jù)。
didChangeDependencies
說到 InheritedWidget ,我們不得不聊聊 state 對象中的 didChangeDependencies
方法。當(dāng)子控件依賴使用了父控件中的 InheritedWidget,比如主題、locale(語言)等發(fā)生變化時(shí),依賴其的子 widget 的didChangeDependencies
方法將會被調(diào)用。
一般來說,子 widget 很少會重寫此方法,因?yàn)樵谝蕾嚫淖兒?framework 也都會調(diào)用build()方法。但是,如果你需要在依賴改變后執(zhí)行一些昂貴的操作,比如網(wǎng)絡(luò)請求,這時(shí)最好的方式就是在此方法中執(zhí)行,這樣可以避免每次build()都執(zhí)行這些昂貴操作。
重點(diǎn): 如子控件build 方法中沒有使用 InheritedShareWidget 的數(shù)據(jù),那么它的didChangeDependencies
將不會被調(diào)用
如何使用?
我們簡單用一個(gè) count 自增的例子來記錄 InheritedWidget 的使用:
- 新建 InheritedShareWidget 繼承 InheritedWidget 作為共享數(shù)據(jù)源,以其為父節(jié)點(diǎn)提供子節(jié)點(diǎn)數(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) { ///當(dāng)子控件依賴使用了我們的數(shù)據(jù)源時(shí),數(shù)據(jù)變動會觸發(fā)子控件中的 didChangeDependencies 方法 return context.dependOnInheritedWidgetOfExactType<InheritedShareWidget>(); ///(前提:子控件使用了數(shù)據(jù)源)子控件中的 didChangeDependencies 方法不會被觸發(fā) // return context.getElementForInheritedWidgetOfExactType<InheritedShareWidget>().widget; } @override bool updateShouldNotify(covariant InheritedShareWidget oldWidget) { //返回true時(shí),才會通知子控件 return oldWidget.data != this.data; } }
注意:updateShouldNotify
方法中,通知指的是通知子控件的didChangeDependencies
方法,前提是子控件使用dependOnInheritedWidgetOfExactType
的方式獲取共享數(shù)據(jù)。
- 子節(jié)點(diǎn)中如何獲取共享數(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); } }
- 兩者通過父子嵌套的關(guān)系聯(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
時(shí),使用了setState
手動觸發(fā)控件進(jìn)行刷新。
結(jié)論
InheritedWidget
只提供我們共享數(shù)據(jù)的能力,以及控制是否在 build 前觸發(fā)didChangeDependencies
的能力。不會主動觸發(fā)build
方法,如果build
沒被觸發(fā),那么didChangeDependencies
也不會被觸發(fā)。
號外擴(kuò)展
InheritedWidget 數(shù)據(jù)共享能力不會受到 Navigator push
新頁面的影響,與原生不一樣,flutter的頁面跳轉(zhuǎn)不是管理一個(gè)堆棧,Navigator
本質(zhì)上是使用 overlay
管理一個(gè) stack
widget,因此 InheritedWidget
基于父子關(guān)系管理的數(shù)據(jù)共享?xiàng)l件沒有被打破
原文鏈接:https://juejin.cn/post/7007676491605475358
相關(guān)推薦
- 2022-10-23 Android實(shí)現(xiàn)底部滾輪式選擇彈跳框_Android
- 2022-04-06 用Python實(shí)現(xiàn)一個(gè)簡單的用戶系統(tǒng)_python
- 2023-05-31 Pandas使用分隔符或正則表達(dá)式將字符串拆分為多列_python
- 2022-05-04 Python的五個(gè)標(biāo)準(zhǔn)數(shù)據(jù)類型你認(rèn)識幾個(gè)_python
- 2022-10-20 C#?Random類隨機(jī)函數(shù)實(shí)例詳解_C#教程
- 2023-02-10 docker安裝nginx容器的方法_docker
- 2022-09-04 Go語言簡介和環(huán)境配置_Golang
- 2022-05-05 Flutter如何保證數(shù)據(jù)操作原子性詳解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支