成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

flutter全局存儲(chǔ),flutter本地存儲(chǔ)

Flutter 之 文件操作(二十九)

Dart的 IO 庫(kù)包含了文件讀寫(xiě)的相關(guān)類(lèi),它屬于 Dart 語(yǔ)法標(biāo)準(zhǔn)的一部分,所以通過(guò) Dart IO 庫(kù),無(wú)論是 Dart VM 下的腳本還是 Flutter,都是通過(guò) Dart IO 庫(kù)來(lái)操作文件的,不過(guò)和 Dart VM 相比,F(xiàn)lutter 有一個(gè)重要差異是文件系統(tǒng)路徑不同,這是因?yàn)镈art VM 是運(yùn)行在 PC 或服務(wù)器操作系統(tǒng)下,而 Flutter 是運(yùn)行在移動(dòng)操作系統(tǒng)中,他們的文件系統(tǒng)會(huì)有一些差異。

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到安圖網(wǎng)站設(shè)計(jì)與安圖網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋安圖地區(qū)。

Android 和 iOS 的應(yīng)用存儲(chǔ)目錄不同, PathProvider 插件提供了一種平臺(tái)透明的方式來(lái)訪(fǎng)問(wèn)設(shè)備文件系統(tǒng)上的常用位置。該類(lèi)當(dāng)前支持訪(fǎng)問(wèn)兩個(gè)文件系統(tǒng)位置:

File代表一個(gè)整體的文件,他有三個(gè)構(gòu)造函數(shù),分別是:

文件讀取本身有兩種形式,一種是文本,一種是二進(jìn)制。

2.2.1 讀取文本內(nèi)容

如果是文本文件,F(xiàn)ile提供了readAsString、readAsLines、readAsStringSync、readAsLinesSync方法,讀取文本內(nèi)容

readAsString 一次性讀取所有文本

readAsLines 一行行的讀取文本

結(jié)果返回的是一個(gè)List,list中表示文件每行的內(nèi)容

readAsStringSync、readAsLinesSync同步讀取文本

2.2.2 讀取二進(jìn)制內(nèi)容

如果文件是二進(jìn)制,那么可以使用readAsBytes或者同步的方法readAsBytesSync:

dart中表示二進(jìn)制有一個(gè)專(zhuān)門(mén)的類(lèi)型叫做Uint8List,他實(shí)際上表示的是一個(gè)int的List。

上面提到的讀取方式,都是一次性讀取整個(gè)文件,缺點(diǎn)就是如果文件太大的話(huà),可能造成內(nèi)存空間的壓力。

所以File為我們提供了另外一種讀取文件的方法,流的形式來(lái)讀取文件.

示例

dart提供了open和openSync兩個(gè)方法來(lái)進(jìn)行隨機(jī)文件讀寫(xiě):

寫(xiě)入和文件讀取一樣,可以一次性寫(xiě)入或者獲得一個(gè)寫(xiě)入句柄,然后再寫(xiě)入。

一次性寫(xiě)入的方法有四種,分別對(duì)應(yīng)字符串和二進(jìn)制

句柄形式可以調(diào)用openWrite方法,返回一個(gè)IOSink對(duì)象,然后通過(guò)這個(gè)對(duì)象進(jìn)行寫(xiě)入:

默認(rèn)情況下寫(xiě)入是會(huì)覆蓋整個(gè)文件的,但是可以通過(guò)下面的方式來(lái)更改寫(xiě)入模式:

雖然dart中所有的異常都是運(yùn)行時(shí)異常,但是和java一樣,要想手動(dòng)處理文件讀寫(xiě)中的異常,則可以使用try,catch:

我們還是以計(jì)數(shù)器為例,實(shí)現(xiàn)在應(yīng)用退出重啟后可以恢復(fù)點(diǎn)擊次數(shù)。 這里,我們使用文件來(lái)保存數(shù)據(jù):

1.引入PathProvider插件;在pubspec.yaml文件中添加如下聲明:

執(zhí)行 flutter pub get

2.實(shí)現(xiàn)如下

參考:

iOS開(kāi)發(fā)Flutter探索-State狀態(tài)保存(10)

有時(shí)候我們不希望某個(gè)頁(yè)面每次打開(kāi)時(shí)都重新加載,比如就我們之前的Tabbar結(jié)構(gòu)的頁(yè)面,每當(dāng)我們?cè)谇袚QTab的時(shí)候都會(huì)執(zhí)行 void initState() ,這就意味著頁(yè)面每次都會(huì)重新渲染,之所以這樣就是因?yàn)槲覀兊?State 狀態(tài)沒(méi)有保存,如下圖所示:

[沒(méi)有狀態(tài)保存效果圖]

給當(dāng)前 State 類(lèi)添加一個(gè)擴(kuò)展(這里就用擴(kuò)展這個(gè)詞吧,其實(shí)類(lèi)似于iOS下的 Category ),一個(gè)系統(tǒng)的擴(kuò)展類(lèi) AutomaticKeepAliveClientMixin ,并重寫(xiě) wantKeepAlive 方法,讓一個(gè)普通的 State 類(lèi),具有保存狀態(tài)的能力。

在Dart語(yǔ)法中通過(guò)使用 with 關(guān)鍵字來(lái)添加擴(kuò)展:

bool get wantKeepAlive = true; 之后,當(dāng)前 State 就具備保存能力了,也就意味著重復(fù)切換Tab后, void initState() 就不會(huì)重復(fù)執(zhí)行了(由原來(lái)的 viewWillAppear() 變成了 viewDidLoad() )。

按照上面方式修改后,發(fā)現(xiàn)切換Tab后 void initState() 依然重復(fù)執(zhí)行了,這是為什么吶?這里我們看下我們之前 root_page.dart 里面是如何配置我們的tabbar結(jié)構(gòu)的:

這里我們是通過(guò)一個(gè) _viewControllers 的List,把4個(gè)子頁(yè)面放在了里面,全局有一個(gè) _currentIndex ,當(dāng) onTap 回調(diào)后后,更新 _currentIndex 的值,執(zhí)行 setState () 后, body 對(duì)應(yīng)的 widget 頁(yè)面發(fā)生改變。而問(wèn)題也就出在這里,當(dāng) body 部分發(fā)生改變時(shí),根據(jù)Flutter的底層渲染邏輯,這里會(huì)移除掉之前的 Widget ,并重新創(chuàng)建新的 Widget ,我們之前在 _viewControllers 放的子頁(yè)面,并不像iOS下是一個(gè)實(shí)例對(duì)象,存在就直接拿來(lái)使用。在Flutter 中 setState () 后界面會(huì)被重新繪制,而 body 部分只知道我要渲染一個(gè)什么樣的 widget ,而該類(lèi)型的 widget 每次都是會(huì)重新創(chuàng)建,這也就意味著我們?cè)赥ab切換時(shí),每次都是重新創(chuàng)建,所以每次都執(zhí)行了 initState() 。

顯然我們現(xiàn)在的方式是不合理的,那在Flutter中如何管理這樣的子頁(yè)面,而避免重復(fù)渲染吶?

這就要用到一個(gè)新的部件了: PageView() ,內(nèi)部的2個(gè)關(guān)鍵屬性:

子頁(yè)面切換通過(guò) _controller.jumpToPage(index); 來(lái)實(shí)現(xiàn)。

這樣子頁(yè)面也就不會(huì)重新創(chuàng)建渲染了,我們的狀態(tài)保存也就能正常實(shí)現(xiàn)了。

學(xué)習(xí)是一個(gè)循序漸進(jìn)的過(guò)程,我們總是在踩坑中不斷的前行,把坑填平了也就意味著我們?cè)谶@個(gè)新的東西面前立了足,就可能進(jìn)行更多為什么的探索了。

Flutter_定義控件StatefulWidgets和StatelessWidget

Stateful(有狀態(tài)) 和 stateless(無(wú)狀態(tài)) widgets

stateless widget 沒(méi)有內(nèi)部狀態(tài). Icon、 IconButton, 和Text 都是無(wú)狀態(tài)widget, 他們都是 StatelessWidget的子類(lèi)。

stateful widget 是動(dòng)態(tài)的. 用戶(hù)可以和其交互 (例如輸入一個(gè)表單、 或者移動(dòng)一個(gè)slider滑塊),或者可以隨時(shí)間改變 (也許是數(shù)據(jù)改變導(dǎo)致的UI更新). Checkbox, Radio, Slider, InkWell, Form, and TextField 都是 stateful widgets, 他們都是 StatefulWidget的子類(lèi)。

StatefulWidget類(lèi)

具有可變狀態(tài)的小部件。

狀態(tài)是(1)在構(gòu)建窗口小部件時(shí)可以同步讀取的信息,以及(2)在窗口小部件的生命周期內(nèi)可能會(huì)更改的信息。這是小工具實(shí)施者的責(zé)任,以確保國(guó)家的及時(shí)通知當(dāng)這種狀態(tài)的改變,使用State.setState。

有狀態(tài)窗口小部件是一個(gè)窗口小部件,它通過(guò)構(gòu)建一個(gè)更具體地描述用戶(hù)界面的其他窗口小部件來(lái)描述用戶(hù)界面的一部分。構(gòu)建過(guò)程以遞歸方式繼續(xù),直到用戶(hù)界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。

當(dāng)您描述的用戶(hù)界面部分可以動(dòng)態(tài)更改時(shí)(例如由于具有內(nèi)部時(shí)鐘驅(qū)動(dòng)狀態(tài)或依賴(lài)于某些系統(tǒng)狀態(tài)),狀態(tài)窗口小部件非常有用。對(duì)于僅依賴(lài)于對(duì)象本身中的配置信息以及窗口小部件膨脹的 BuildContext的組合,請(qǐng)考慮使用 StatelessWidget。

StatefulWidget實(shí)例本身是不可變的,并且將它們的可變狀態(tài)存儲(chǔ)在由createState方法創(chuàng)建的單獨(dú)State對(duì)象中 ,或者存儲(chǔ)在State訂閱的對(duì)象中,例如Stream或ChangeNotifier對(duì)象,其引用存儲(chǔ)在StatefulWidget的最終字段中本身。

框架在膨脹StatefulWidget時(shí) 調(diào)用createState,這意味著如果該窗口小部件已插入到多個(gè)位置的樹(shù)中,則多個(gè)State對(duì)象可能與同一StatefulWidget關(guān)聯(lián)。同樣,如果StatefulWidget從樹(shù)中移除,后來(lái)在樹(shù)再次插入時(shí),框架將調(diào)用createState再創(chuàng)建一個(gè)新的國(guó)家目標(biāo),簡(jiǎn)化的生命周期狀態(tài)的對(duì)象。

如果StatefulWidget的創(chuàng)建者使用GlobalKey作為其 鍵,則StatefulWidget在從樹(shù)中的一個(gè)位置移動(dòng)到另一個(gè)位置時(shí)保持相同的State對(duì)象。由于具有GlobalKey的窗口小部件可以在樹(shù)中的至多一個(gè)位置使用,因此使用GlobalKey的窗口小部件最多只有一個(gè)關(guān)聯(lián)元素。當(dāng)通過(guò)將與該窗口小部件關(guān)聯(lián)的(唯一)子樹(shù)從舊位置移植到新位置(而不是在該位置重新創(chuàng)建子樹(shù))時(shí),框架利用此屬性將全局鍵從樹(shù)中的一個(gè)位置移動(dòng)到另一個(gè)位置時(shí)利用此屬性。新的位置)。與StatefulWidget關(guān)聯(lián)的State對(duì)象與子樹(shù)的其余部分一起被移植,這意味著State對(duì)象在新位置被重用(而不是被重新創(chuàng)建)。但是,為了有資格進(jìn)行嫁接,必須將窗口小部件插入到從舊位置移除它的同一動(dòng)畫(huà)幀中的新位置。

StatefulWidget有兩個(gè)主要類(lèi)別。

首先是其中一個(gè)分配資源State.initState并在他們的處置State.dispose,但不依賴(lài)于InheritedWidget S或致電State.setState。這些小部件通常在應(yīng)用程序或頁(yè)面的根目錄中使用,并通過(guò)ChangeNotifier, Stream或其他此類(lèi)對(duì)象與子小部件進(jìn)行通信。遵循這種模式的有狀態(tài)小部件相對(duì)便宜(就CPU和GPU周期而言),因?yàn)樗鼈儤?gòu)建一次然后永不更新。因此,它們可能有一些復(fù)雜和深刻的構(gòu)建方法。

第二類(lèi)是使用State.setState或依賴(lài)于 InheritedWidget的小部件。這些通常會(huì)在應(yīng)用程序的生命周期內(nèi)重建多次,因此最小化重建此類(lèi)窗口小部件的影響非常重要。(他們也可以使用State.initState或 State.didChangeDependencies并分配資源,但重要的是他們重建。)

可以使用幾種技術(shù)來(lái)最小化重建有狀態(tài)窗口小部件的影響:

StatelessWidget類(lèi)

一個(gè)不需要可變狀態(tài)的小部件。

無(wú)狀態(tài)窗口小部件是一個(gè)窗口小部件,它通過(guò)構(gòu)建一個(gè)更具體地描述用戶(hù)界面的其他窗口小部件來(lái)描述用戶(hù)界面的一部分。構(gòu)建過(guò)程以遞歸方式繼續(xù),直到用戶(hù)界面的描述完全具體(例如,完全由RenderObjectWidget組成,其描述具體的RenderObject)。

當(dāng)您描述的用戶(hù)界面部分不依賴(lài)于對(duì)象本身的配置信息以及窗口小部件膨脹的BuildContext時(shí),無(wú)狀態(tài)窗口小部件非常有用。對(duì)于可以動(dòng)態(tài)更改的組合,例如由于具有內(nèi)部時(shí)鐘驅(qū)動(dòng)狀態(tài)或依賴(lài)于某些系統(tǒng)狀態(tài),請(qǐng)考慮使用StatefulWidget。

無(wú)狀態(tài)窗口小部件的構(gòu)建方法通常僅在以下三種情況下調(diào)用:第一次將窗口小部件插入樹(shù)中,窗口小部件的父窗口更改其配置時(shí),以及何時(shí)依賴(lài)于更改的InheritedWidget。

如果窗口小部件的父級(jí)將定期更改窗口小部件的配置,或者它依賴(lài)于經(jīng)常更改的繼承窗口小部件,則優(yōu)化構(gòu)建方法的性能以保持流暢的呈現(xiàn)性能非常重要。

可以使用幾種技術(shù)來(lái)最小化重建無(wú)狀態(tài)窗口小部件的影響:

flutter provider的理解

provider 是flutter 中的狀態(tài)管理 開(kāi)源庫(kù);

存儲(chǔ)的數(shù)據(jù)對(duì)象 必須extends ChangeNotifier;下層widget 通過(guò) Provider.of(context) 函數(shù) 獲取model對(duì)象 ,并且可以建立依賴(lài)關(guān)系;當(dāng)數(shù)據(jù)對(duì)象發(fā)生變化時(shí),依賴(lài)的widget 會(huì)重新build,像不像InheritedWidget Provider 沒(méi)錯(cuò) 下層widget就是 封裝了InheritedWidget

主要 通過(guò) Provider.ofT(context) 函數(shù),來(lái)獲??;

推薦使用 Provider.of而不是 Consumer,因?yàn)?listen默認(rèn)為true,也就是說(shuō) 默認(rèn) 依賴(lài)于 持有數(shù)據(jù)model的widget 對(duì)應(yīng)的element;

數(shù)據(jù)類(lèi) 可繼承的 ChangeNotifier,本身和privider框架 沒(méi)有關(guān)系;

ChangeNotifier 是 flutter框架 提供的工具類(lèi), 用來(lái)實(shí)現(xiàn)一對(duì)多的訂閱通知功能。

第十六章:Flutter數(shù)據(jù)存儲(chǔ)

Flutter的數(shù)據(jù)存儲(chǔ)分為三類(lèi)

Preference相當(dāng)于iOS的NSUserDefaults,其實(shí)也是按plist的方式存儲(chǔ)的

step1:添加依賴(lài)

step2:pub get

step3:導(dǎo)入頭文件

在path_provider中有三個(gè)獲取文件路徑的方法:

- getTemporaryDirectory()

://獲取應(yīng)用緩存目錄,等同iOS的NSTemporaryDirectory()和Android的getCacheDir() 方法。

- getApplicationDocumentsDirectory():

//獲取應(yīng)用文件目錄類(lèi)似于iOS的NSDocumentDirectory和Android上的 AppData目錄。

step1:添加依賴(lài)

step2:pub get

step3:導(dǎo)入頭文件

Flutter全局狀態(tài)管理機(jī)

需求:

· 在我的界面,展示了用戶(hù)信息姓名、年齡、性別等信息

· 我的界面有一個(gè)設(shè)置按鈕,可以修改這些用戶(hù)信息

· 修改之后怎么刷新呢?

· 這時(shí)候就使用到全局狀態(tài)管理

eg:

訪(fǎng)問(wèn)數(shù)據(jù)?

更新數(shù)據(jù)?

/// 在需要更新或者獲取全局狀態(tài)時(shí)候需要獲取到store ?

/// 點(diǎn)擊事件 更新全局狀態(tài) 1、創(chuàng)建對(duì)象 2、調(diào)用更新方法?

/// 哪里需要使用全局狀態(tài),就在最外面new StoreBuilder?

Flutter完整開(kāi)發(fā)實(shí)戰(zhàn)詳解

Dio網(wǎng)絡(luò)請(qǐng)求

UI界面

本文標(biāo)題:flutter全局存儲(chǔ),flutter本地存儲(chǔ)
本文網(wǎng)址:http://jinyejixie.com/article48/dseohep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司定制網(wǎng)站營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、用戶(hù)體驗(yàn)Google、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司
台北县| 嵊泗县| 玉龙| 九龙县| 高碑店市| 高邮市| 定西市| 临泽县| 綦江县| 枞阳县| 玉树县| 怀远县| 微博| 怀来县| 札达县| 民县| 宁强县| 乐清市| 余庆县| 苗栗市| 余江县| 蕉岭县| 探索| 翁源县| 秀山| 松原市| 新泰市| 宜城市| 攀枝花市| 岳普湖县| 永新县| 收藏| 天镇县| 合江县| 鹤壁市| 仁怀市| 内黄县| 永定县| 平顺县| 工布江达县| 哈巴河县|