最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flutter UI如何使用Provide實(shí)現(xiàn)主題切換詳解

 更新時(shí)間:2019年04月05日 10:06:35   作者:Efox  
這篇文章主要給大家介紹了關(guān)于Flutter UI如何使用Provide實(shí)現(xiàn)主題切換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Flutter具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

背景

provide是谷歌官方出品的一個(gè)狀態(tài)管理框架flutter-provide,它允許在小部件樹中傳遞數(shù)據(jù),它被設(shè)計(jì)為ScopedModel的替代品,允許我們更加靈活地處理數(shù)據(jù)類型和數(shù)據(jù)

為什么需要狀態(tài)管理

在進(jìn)行項(xiàng)目的開發(fā)時(shí),我們往往需要管理不同頁(yè)面之間的數(shù)據(jù)共享,在頁(yè)面功能復(fù)雜,狀態(tài)達(dá)到幾十個(gè)上百個(gè)的時(shí)候,我們會(huì)難以清楚的維護(hù)我們的數(shù)據(jù)狀態(tài),本文將以主題切換這個(gè)功能使用狀態(tài)管理來(lái)講解如何在Flutter中使用provide這個(gè)狀態(tài)管理框架

為什么選擇Provide

一開始項(xiàng)目使用的是ScopedModel,使用ScopedModel可以分離展示邏輯和業(yè)務(wù)邏輯,而且簡(jiǎn)單易用,但是ScopedModel有一些局限

如果模型較為復(fù)雜,當(dāng)狀態(tài)更新時(shí),會(huì)有較多的不必要的更新

使用Provide

  • 當(dāng)狀態(tài)發(fā)生變化時(shí),widget樹會(huì)更新指定的節(jié)點(diǎn),不會(huì)進(jìn)行整顆widget樹的更新
  • Provide有泛型的優(yōu)勢(shì),相當(dāng)于namespace的特性,使用過(guò)vuex的應(yīng)該知道namespace的重要性,它將我們的狀態(tài)分離開來(lái)
  • Provide被設(shè)計(jì)為ScopedModel的替代品,同樣也有和ScopedModel的易用性
  • Provide提供了Provide.stream可以以處理流的方式處理數(shù)據(jù),不過(guò)目前還存在一些問題

項(xiàng)目地址

flutter-ui, 可參考項(xiàng)目中使用provide方法

效果

如何使用

添加依賴

查看 pub-install

在pubspec.yaml中引入依賴

dependencies:
 provide: ^1.0.2 #數(shù)據(jù)管理層

執(zhí)行

flutter packages get

在需要使用的頁(yè)面中引入

import 'package:provide/provide.dart'

創(chuàng)建model (這才第一步)

新建 lib/store/models/config_state_model.dart 文件

import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart' show ChangeNotifier

class ConfigInfo {
 String theme = 'red';
}
class ConfigModel extends ConfigInfo with ChangeNotifier {
 Future $setTheme(payload) async {
  theme = payload;
  notifyListeners();
 }
}

用法同ScopedModel差不多,不過(guò)不需要繼承Model類,只需要混入ChangeNotifier,通過(guò)notifyListeners通知聽眾刷新

封裝Store (沒錯(cuò),到這里已經(jīng)要快完成所有步驟了)

新建 lib/store/index.dart 文件

import 'package:flutter/material.dart'
import 'package:provide/provide.dart'
 show
  Providers
  Provider,
  Provide,
  ProviderNode;
import './models/config_state_model.dart' show ConfigModel;

class Store {
 // 我們將會(huì)在main.dart中runAPP實(shí)例化init
 static init({model, child, dispose = true}) {
  final providers = Providers()
   ..provide(Provider.value(ConfigModel()));
  return ProviderNode(
   child: child,
   providers: providers,
   dispose: dispose
  );
 }
 
 // 通過(guò)Provide小部件獲取狀態(tài)封裝
 static connect<T>({builder, child, scope}) {
  return Provide<T>(
   builder: builder,
   child: child,
   scope: scope
  );
 }
 
 // 通過(guò)Provide.value<T>(context)獲取封裝
 static T value<T>(context, {scope}) {
  return Provide.value<T>(context, scoped: scoped);
 }
}

需要管理多個(gè)狀態(tài)只需要

final providers = Providers()
..provide(Provider.value(ConfigModel()))
..provide(Provider.value(More()));

定義全局的Provide (倒數(shù)第二)

lib/main.dart 文件

import 'package:flutter/material.dart';
import 'package:efox_flutter/store/index.dart'
 show Store, ConfigModel;

// 將狀態(tài)放入到頂層
void main() => runApp(Store.init(child: MainApp()));
class MainApp extends StatefulWidget {
 @override
 MainAppState createState() => MainAppState();
}
class MainAppState extends State<MainApp> {
 @override
 Widget build(BuildContext context) {
  // 獲取Provide狀態(tài)
  return Store.connect<ConfigModel>(
   builder: (context, child, model) {
    return MaterialApp(
     theme: ThemeData(
      primaryColor: Color(model.theme)
     )
    );
   }
  );
 }
}

改變主題狀態(tài) (完成)

import 'package:flutter/material.dart';
import 'package:efox_flutter/store/index.dart'
 show ConfigModel, Store;

/**
* name: 顏色名稱 如 red
* color:顏色值
* context: 上下文
*/
Widget Edage(name, color, context) {
 return GestrueDetector(
  onTap: () {
   // 修改主題狀態(tài)
   Store.value<ConfigModel>(context).$setTheme(name)
  }
  child: Container(
   color: Color(color),
   height: 30,
   widtg: 30
  )
 );
}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 基于Android實(shí)現(xiàn)可滾動(dòng)的環(huán)形菜單效果

    基于Android實(shí)現(xiàn)可滾動(dòng)的環(huán)形菜單效果

    這篇文章主要為大家詳細(xì)介紹了Android如何使用kotlin實(shí)現(xiàn)可滾動(dòng)的環(huán)形菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android實(shí)現(xiàn)卡片翻轉(zhuǎn)動(dòng)畫

    Android實(shí)現(xiàn)卡片翻轉(zhuǎn)動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)卡片翻轉(zhuǎn)動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 利用Flutter繪制出3D效果動(dòng)畫

    利用Flutter繪制出3D效果動(dòng)畫

    本文主要介紹了Flutter繪圖的Path的應(yīng)用。Flutter的Path類提供了一個(gè)三維空間的變換方法,可以實(shí)現(xiàn)路徑在三維空間的平移、旋轉(zhuǎn)等操作,從而可以實(shí)現(xiàn)3D繪制的效果,感興趣的可以了解一下
    2022-08-08
  • Android studio導(dǎo)出APP測(cè)試包和構(gòu)建正式簽名包

    Android studio導(dǎo)出APP測(cè)試包和構(gòu)建正式簽名包

    大家好,本篇文章主要講的是Android studio導(dǎo)出APP測(cè)試包和構(gòu)建正式簽名包,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2021-12-12
  • Android動(dòng)態(tài)權(quán)限申請(qǐng)實(shí)現(xiàn)步驟分解

    Android動(dòng)態(tài)權(quán)限申請(qǐng)實(shí)現(xiàn)步驟分解

    對(duì)于一些危險(xiǎn)權(quán)限在AndroidManifest清單文件中申請(qǐng)之后,還需要得到用戶的許可并打開,才算是真正的開啟了這個(gè)權(quán)限。所以可以使用動(dòng)態(tài)申請(qǐng)權(quán)限,對(duì)于某個(gè)功能,如果需要開啟某個(gè)權(quán)限,在用戶使用它之前,彈窗提示用戶是否要開啟這個(gè)權(quán)限
    2023-04-04
  • Android Flutter制作交錯(cuò)動(dòng)畫的示例代碼

    Android Flutter制作交錯(cuò)動(dòng)畫的示例代碼

    這篇文章我們將用Flutter實(shí)現(xiàn)一個(gè)交錯(cuò)動(dòng)畫的應(yīng)用實(shí)例,我們讓輪子在草地滾動(dòng)著前進(jìn),而且還能粘上“綠色的草”,感興趣的可以動(dòng)手嘗試一下
    2022-06-06
  • Android實(shí)現(xiàn)圖片上傳功能

    Android實(shí)現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 關(guān)于Android 6.0權(quán)限的動(dòng)態(tài)適配詳解

    關(guān)于Android 6.0權(quán)限的動(dòng)態(tài)適配詳解

    Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用戶體驗(yàn), 同時(shí)也為程序員帶來(lái)新的負(fù)擔(dān). 動(dòng)態(tài)權(quán)限管理就是這樣, 一方面讓用戶更加容易的控制自己的隱私, 一方面需要重新適配應(yīng)用權(quán)限,本文介紹了關(guān)于Android 6.0權(quán)限動(dòng)態(tài)適配的相關(guān)資料,需要的朋友可以參考下。
    2017-11-11
  • Android下錄制App操作生成Gif動(dòng)態(tài)圖的全過(guò)程

    Android下錄制App操作生成Gif動(dòng)態(tài)圖的全過(guò)程

    這篇文章主要為大家分享了Android下錄制App操作生成Gif動(dòng)態(tài)圖的全過(guò)程,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Flutter?Widget開發(fā)之Focus組件圖文詳解

    Flutter?Widget開發(fā)之Focus組件圖文詳解

    這篇文章主要為大家介紹了Flutter?Widget開發(fā)之Focus組件圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論

建阳市| 云林县| 蓬安县| 扎兰屯市| 睢宁县| 日照市| 浦北县| 宁远县| 柘荣县| 温州市| 新竹市| 乌拉特前旗| 饶河县| 双辽市| 新闻| 西昌市| 栖霞市| 喜德县| 金塔县| 缙云县| 大悟县| 东乡| 滨海县| 瓮安县| 青龙| 尉犁县| 都兰县| 旅游| 怀柔区| 花莲县| 页游| 北宁市| 夹江县| 从江县| 南投县| 尼勒克县| 吴忠市| 类乌齐县| 扶沟县| 平顺县| 岑巩县|