亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

flutter狀態(tài)管理Provider的使用學(xué)習(xí)

 更新時(shí)間:2022年07月20日 14:40:31   作者:潛水的魚兒  
這篇文章主要為大家介紹了flutter狀態(tài)管理Provider的使用學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要介紹flutter中狀態(tài)管理組件provider,provider: ^6.0.3主要是用于我們系統(tǒng)InheritedWidge的封裝,用于數(shù)據(jù)的傳遞和管理。

1. provider的使用

網(wǎng)上也有很多關(guān)于provider說(shuō)明,也可以看下官方的provider的 README。這里我記錄一下我自己學(xué)習(xí)。
我們對(duì)于簡(jiǎn)單的數(shù)據(jù)共享可以設(shè)置參數(shù),之后子頁(yè)面進(jìn)行數(shù)據(jù)方法回調(diào),從而完成數(shù)據(jù)間的通信。但是比較麻煩,下面我們看下我們使用provider如何達(dá)到這個(gè)效果。

我們2個(gè)頁(yè)面使用同一個(gè)數(shù)據(jù),在第二個(gè)頁(yè)面使用點(diǎn)擊增加方法。之后返回在第一個(gè)頁(yè)面也顯示出增加后的數(shù)據(jù)count達(dá)到同步的效果。

點(diǎn)擊增加

看下代碼實(shí)現(xiàn)首先是使用StatelessWidget來(lái)顯示頁(yè)面,簡(jiǎn)單的頁(yè)面跳轉(zhuǎn)就不展示了。我們定義一個(gè)model用來(lái)存儲(chǔ)我們的count,我么混入通過(guò)混入 ChangeNotifier 管理監(jiān)聽者(通知模式)。我們寫讀數(shù)據(jù),并且當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候,使用通知更新數(shù)據(jù)。

class CountModel with ChangeNotifier {
  int _count = 0;
  // 讀方法
  int get counter => _count;
  // 寫方法
  void increment() {
    _count++;
    notifyListeners(); // 通知監(jiān)聽者刷新
  }
}

我們2個(gè)頁(yè)面都要使用這個(gè)數(shù)據(jù),我們要把這個(gè)數(shù)據(jù)放在這2個(gè)子頁(yè)面的父節(jié)點(diǎn)上。通過(guò) Provider 組件封裝數(shù)據(jù)資源,value就是需要共享的數(shù)據(jù)資源

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    // 通過(guò) Provider 組件封裝數(shù)據(jù)資源
    return ChangeNotifierProvider.value(
        value: CountModel(), // 需要共享的數(shù)據(jù)資源
        child: MaterialApp(
          home: FirstPage(),
        ));
  }
}

我們?cè)陧?yè)面使用的地方進(jìn)行取數(shù)據(jù)

final _counter = Provider.of<CountModel>(context);

上下文就包含了我們父節(jié)點(diǎn)中設(shè)置的value 即CountModel()。

// 第一個(gè)頁(yè)面
class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 取出數(shù)據(jù)
    final _counter = Provider.of&lt;CountModel&gt;(context);
    return Scaffold(
        appBar: AppBar(
          title: const Text('第一個(gè)頁(yè)面'),
        ),
        body: Center(
          child: Text('第一個(gè)頁(yè)面count:${_counter.counter}'),
        ),
        // 跳轉(zhuǎn)到 SecondPage
        floatingActionButton: FloatingActionButton(
            child: const Icon(Icons.next_plan),
            onPressed: () =&gt; Navigator.of(context)
                .push(MaterialPageRoute(builder: (context) =&gt; SecondPage()))));
  }
}
// 第二個(gè)頁(yè)面
class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 取出數(shù)據(jù)
    final _counter = Provider.of&lt;CountModel&gt;(context);
    return Scaffold(
        appBar: AppBar(
          title: const Text('第二個(gè)頁(yè)面'),
        ),
        // 展示資源中的數(shù)據(jù)
        body: Center(
          child: Text('第二個(gè)頁(yè)面count:${_counter.counter}'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _counter.increment,
          child: const Icon(Icons.add),
        ),
    );
  }
}

通過(guò)provider很簡(jiǎn)單的達(dá)到了我們的數(shù)據(jù)共享,同時(shí)通過(guò)通知讓我們的頁(yè)面進(jìn)行了刷新。

2. 控制Widget的刷新顆粒度

我們上面的頁(yè)面中涉及的Widget變化也就是一個(gè)文字的展示,沒(méi)有必要整個(gè)頁(yè)面都刷新,這樣可以提高我們的性能。

我們把我們Icon換成自定義的,可以發(fā)現(xiàn)當(dāng)我們點(diǎn)擊的時(shí)候就會(huì)一直重新build,實(shí)際我們不需要他們變化,那么我們只要我們那個(gè)Widget使用了數(shù)據(jù),我們刷新該Widget即可。我們就要使用Consumer

final Widget Function(
  BuildContext context,
  T value,
  Widget? child,
) builder;

定義child為我們包裹的widget,T為我們model的類型。

body: Center(
  child: Consumer<CountModel>(
    builder: (context,CountModel counter,_) => Text('第二個(gè)頁(yè)面count:${counter.counter}'),
  ),
),

這里我們的child為空直接每次刷新Consumer的Widget。那么我們的button怎么刷新呢

floatingActionButton: Consumer<CountModel>(
  builder: (context, CountModel counter, child) => FloatingActionButton(
    onPressed: counter.increment,
    child: child,
  ),
  child: MyIcon(),
)

這里我們使用child屬性,把我們的builder隔離開,這樣我們就可以是我們的數(shù)據(jù)和視圖做到隔離效果。

3. 小結(jié)

對(duì)于數(shù)據(jù)共享和數(shù)據(jù)傳遞provider組件確實(shí)提供了我們快捷的方式,我們?cè)谑褂玫倪^(guò)程中要注意provider組件位于父節(jié)點(diǎn)位置,這樣子節(jié)點(diǎn)才能共享數(shù)據(jù)狀態(tài),其次我們盡可能的減少我們刷新的顆粒度,最好在使用數(shù)據(jù)的地方進(jìn)行刷新組件。

以上就是flutter狀態(tài)管理Provider的使用學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于flutter狀態(tài)管理Provider的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IOS實(shí)現(xiàn)圖片輪播無(wú)限循環(huán)效果

    IOS實(shí)現(xiàn)圖片輪播無(wú)限循環(huán)效果

    這篇文章主要為大家詳細(xì)介紹了IOS實(shí)現(xiàn)圖片輪播無(wú)限循環(huán)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • IOS 播放系統(tǒng)提示音使用總結(jié)(AudioToolbox)

    IOS 播放系統(tǒng)提示音使用總結(jié)(AudioToolbox)

    這篇文章主要介紹了IOS 播放系統(tǒng)提示音使用總結(jié)(AudioToolbox)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • Objective-C中block循環(huán)引用問(wèn)題詳解

    Objective-C中block循環(huán)引用問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于Objective-C中block循環(huán)引用問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Objective-C具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • IOS 開發(fā)之操作圖庫(kù)自定義控制器

    IOS 開發(fā)之操作圖庫(kù)自定義控制器

    這篇文章主要介紹了IOS 開發(fā)之操作圖庫(kù)自定義控制器的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • iOS開發(fā)之通過(guò)銀行卡號(hào)獲取所屬銀行名稱

    iOS開發(fā)之通過(guò)銀行卡號(hào)獲取所屬銀行名稱

    本文給大家分享一段代碼關(guān)于ios通過(guò)銀行卡號(hào)獲取所屬銀行名稱,代碼簡(jiǎn)單易懂,在項(xiàng)目開發(fā)中經(jīng)常會(huì)遇到這樣的功能,需要的朋友一起學(xué)習(xí)吧
    2016-11-11
  • iOS 使用AFN上傳視頻到服務(wù)器示例代碼

    iOS 使用AFN上傳視頻到服務(wù)器示例代碼

    本篇文章主要介紹了iOS 使用AFN上傳視頻到服務(wù)器示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-04-04
  • ios 實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式

    ios 實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式

    這篇文章主要介紹了ios實(shí)現(xiàn)倒計(jì)時(shí)的兩種方式,第一種方式使用NSTimer來(lái)實(shí)現(xiàn),第二種方式使用GCD來(lái)實(shí)現(xiàn)。具體內(nèi)容詳情大家參考下本文
    2017-01-01
  • iOS開發(fā)筆記之鍵盤、靜態(tài)庫(kù)、動(dòng)畫和Crash定位

    iOS開發(fā)筆記之鍵盤、靜態(tài)庫(kù)、動(dòng)畫和Crash定位

    最近在學(xué)習(xí)iOS開發(fā),進(jìn)行了一些實(shí)戰(zhàn),所以下面這篇文章主要給大家介紹了關(guān)于iOS開發(fā)筆記之鍵盤、靜態(tài)庫(kù)、動(dòng)畫和Crash定位的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-04-04
  • IOS獲取各種文件目錄路徑的方法

    IOS獲取各種文件目錄路徑的方法

    ios獲取文件路徑的方法,iphone沙箱模型的四個(gè)文件夾,通過(guò)documents,tmp,app,Library得到模擬器路徑的簡(jiǎn)單方式,下面小編整理相關(guān)資料,把IOS獲取各種文件目錄路徑的方式總結(jié)如下,需要的朋友可以參考下
    2015-08-08
  • 超精準(zhǔn)的iOS計(jì)步器實(shí)現(xiàn)代碼

    超精準(zhǔn)的iOS計(jì)步器實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了超精準(zhǔn)的iOS計(jì)步器實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評(píng)論