欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解

 更新時間:2022年11月14日 16:53:19   作者:李小轟_Rex  
這篇文章主要為大家介紹了flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

InheritedWidget簡單數(shù)據(jù)驅(qū)動模型

基于InheritedWidget,實現(xiàn)簡單的數(shù)據(jù)驅(qū)動模型,模型結(jié)構(gòu)如下:

1. 數(shù)據(jù)存儲

使用 InheritedWidget,新建 InheritedProvider

import 'package:flutter/material.dart';
class InheritedProvider<T> extends InheritedWidget {
  final T data;
  InheritedProvider({@required this.data, Widget child}) : super(child: child);
  @override
  bool updateShouldNotify(InheritedProvider<T> oldWidget) {
    //在此簡單返回true,則每次更新都會調(diào)用依賴其的子孫節(jié)點的 didChangeDependencies
    return true;
  }
}

2. 變更通知

使用flutter自帶的 ChangeNotifier 組件,封裝工具類 ChangeNotifierProvider 用于響應(yīng)數(shù)據(jù)變更,觸發(fā)UI更新。

class ChangeNotifierProvider<T extends ChangeNotifier> extends StatefulWidget {
  final Widget child;
  final T data; //共享的數(shù)據(jù)模型,要求繼承ChangeNotifier
  const ChangeNotifierProvider({
    Key key,
    this.child,
    this.data,
  }) : super(key: key);
  ///提供方法,子樹獲取共享數(shù)據(jù)
  static T of<T>(BuildContext context) {
    final provider =
        context.dependOnInheritedWidgetOfExactType<InheritedProvider<T>>();
    return provider.data;
  }
  @override
  _ChangeNotifierProviderState createState() =>
      _ChangeNotifierProviderState<T>();
}
class _ChangeNotifierProviderState<T extends ChangeNotifier>
    extends State<ChangeNotifierProvider<T>> {
  ///如果數(shù)據(jù)發(fā)生變化(model類調(diào)用 notifyListeners),重新構(gòu)建InheritedProvider
  void update() {
    setState(() => {});
  }
  @override
  void didUpdateWidget(ChangeNotifierProvider<T> oldWidget) {
    ///當Provider更新時,如果新舊數(shù)據(jù)不"==",則解綁舊數(shù)據(jù)監(jiān)聽,同時添加新數(shù)據(jù)監(jiān)聽
    if (widget.data != oldWidget.data) {
      oldWidget.data.removeListener(update);
      widget.data.addListener(update);
    }
    super.didUpdateWidget(oldWidget);
  }
  @override
  void initState() {
    widget.data.addListener(update);
    super.initState();
  }
  @override
  void dispose() {
    widget.data.removeListener(update);
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return InheritedProvider<T>(
      data: widget.data,
      child: widget.child,
    );
  }
}

原理:使用InheritedWidget作為父節(jié)點,當數(shù)據(jù)源更新時,數(shù)據(jù)模型經(jīng)過ChangeNotifier的關(guān)聯(lián),觸發(fā) _ChangeNotifierProviderState 的 setState方法,刷新UI。

封裝 NotifyConsumer 直接顯式調(diào)用 ChangeNotifierProvider.of 獲取共享數(shù)據(jù)語義不明確,我們將其做一層簡單的封裝用于子節(jié)點獲取數(shù)據(jù):

///響應(yīng)數(shù)據(jù)變化的消費者
class NotifyConsumer<T> extends StatelessWidget {
  final Widget Function(BuildContext context, T value) builder;
  const NotifyConsumer({Key key, @required this.builder}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return builder(
      context,
      ChangeNotifierProvider.of<T>(context),
    );
  }
}

3. 使用方法

創(chuàng)建一個共享數(shù)據(jù)模型:

///共享數(shù)據(jù)模型
class CountModel extends ChangeNotifier {
  int _count = 0;
  int get count => _count;
  //提供自增方法
  void increase() {
    _count++;
    // 通知監(jiān)聽器(訂閱者),重新構(gòu)建InheritedProvider, 更新狀態(tài)。
    notifyListeners();
  }
}

ChangeNotifierProvider 的使用方式:

import 'package:flutter/material.dart';
import 'package:test_interited/provider/change_notifier_provider.dart';
import 'package:test_interited/provider/notify_consumer.dart';
import 'package:test_interited/provider/test/count_model.dart';
class TestNotifierWidget extends StatefulWidget {
  const TestNotifierWidget({Key key}) : super(key: key);
  @override
  _TestNotifierWidgetState createState() => _TestNotifierWidgetState();
}
class _TestNotifierWidgetState extends State<TestNotifierWidget> {
  @override
  Widget build(BuildContext context) {
    return Center(
        child: ChangeNotifierProvider<CountModel>(
            data: CountModel(),
            child: Builder(builder: (context) {
              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Builder(
                    builder: (context) {
                      //獲取共享數(shù)據(jù)源
                      return NotifyConsumer<CountModel>(
                          builder: (context, value) {
                        return Text(value.count.toString());
                      });
                    },
                  ),
                  Builder(builder: (context) {
                    return RaisedButton(
                      child: Text('自增'),
                      onPressed: () {
                        //獲取共享model,進行數(shù)據(jù)自增操作
                        ChangeNotifierProvider.of<CountModel>(context).increase();
                      },
                    );
                  }),
                ],
              );
            })));
  }
}

以上就是flutter自定義InheritedProvider實現(xiàn)狀態(tài)管理詳解的詳細內(nèi)容,更多關(guān)于flutter自定義InheritedProvider的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android新建水平節(jié)點進度條示例

    Android新建水平節(jié)點進度條示例

    這篇文章主要為大家介紹了Android新建水平節(jié)點進度條示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Android ListView長按彈出菜單二種實現(xiàn)方式示例

    Android ListView長按彈出菜單二種實現(xiàn)方式示例

    這篇文章主要介紹了Android ListView長按彈出菜單的方法,大家參考實現(xiàn)
    2013-11-11
  • Kotlin協(xié)程概念原理與使用萬字梳理

    Kotlin協(xié)程概念原理與使用萬字梳理

    協(xié)程的作用是什么?協(xié)程是一種輕量級的線程,解決異步編程的復雜性,異步的代碼使用協(xié)程可以用順序進行表達,文中通過示例代碼介紹詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-08-08
  • Android自定義漸變式炫酷ListView下拉刷新動畫

    Android自定義漸變式炫酷ListView下拉刷新動畫

    這篇文章主要為大家詳細介紹了Android自定義漸變式炫酷ListView下拉刷新動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android實現(xiàn)動態(tài)高斯模糊效果

    Android實現(xiàn)動態(tài)高斯模糊效果

    在Android開發(fā)中常常會用到高斯模糊,但有的時候我們可能會需要一個圖片以不同的模糊程度展現(xiàn)出來,那如何實現(xiàn)呢,一起通過本文來學習學習吧。
    2016-08-08
  • Android實現(xiàn)手機震動抖動效果的方法

    Android實現(xiàn)手機震動抖動效果的方法

    今天小編就為大家分享一篇關(guān)于Android實現(xiàn)手機震動抖動效果的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Android仿百度地圖小度語音助手的貝塞爾曲線動畫

    Android仿百度地圖小度語音助手的貝塞爾曲線動畫

    這篇文章主要為大家詳細介紹了Android仿百度地圖小度語音助手的貝塞爾曲線動畫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android中常見的圖形繪制方式總結(jié)

    Android中常見的圖形繪制方式總結(jié)

    Android中繪制圖片或形狀是我們常遇到的事情,通過最近的學習與在網(wǎng)上學習的案例與資料那么我今天就總結(jié)一下,這篇文章主要給大家介紹了關(guān)于Android中常見的圖形繪制方式,需要的朋友可以參考下
    2021-07-07
  • Android 實現(xiàn)單線程輪循機制批量下載圖片

    Android 實現(xiàn)單線程輪循機制批量下載圖片

    這篇文章主要介紹了Android 單線程輪循機制批量下載圖片的相關(guān)資料,這里對實現(xiàn)步驟做了詳細介紹,需要的朋友可以參考下
    2017-07-07
  • ReactNative Alert詳解及實例代碼

    ReactNative Alert詳解及實例代碼

    這篇文章主要介紹了ReactNative Alert詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評論