Fiutter- 數(shù)據(jù)存儲

前言

FlutterGoogle開源的構(gòu)建用戶界面(UI)工具包喉祭,幫助開發(fā)者通過一套代碼庫高效構(gòu)建多平臺精美應(yīng)用,支持移動爆办、Web难咕、桌面和嵌入式平臺。Flutter 開源距辆、免費余佃,擁有寬松的開源協(xié)議,適合商業(yè)項目挑格。目前咙冗,Flutter已推出穩(wěn)定的2.0版本。也是目前最火的跨平臺開發(fā)工具之一

header-illustration.png

文件系統(tǒng)

AndroidIOS由于系統(tǒng)差異漂彤,在文件系統(tǒng)中有不同的處理雾消,這里需要使用到Google官方的插件path_provider

添加插件依賴

pubspec.yaml文件中添加依賴

dependencies:
  path_provider: ^1.6.14

然后執(zhí)行命令

flutter pub get

如果在運行命令時候出現(xiàn)

Waiting for another flutter command to release the startup lock...

則需要

  1. 結(jié)束掉Dart.exe進(jìn)程
    2.刪除掉flutter sdk下面的/bin/cache/lockfile文件即可

等待命令執(zhí)行完畢,就可以在目錄下看到以及下載好的插件


dependency.png

Android的文件存儲

  • 內(nèi)部存儲
    此存儲區(qū)域只有當(dāng)前應(yīng)用可以訪問挫望,其他應(yīng)用無法正常訪問立润,是應(yīng)用的獨立存儲區(qū)域,路徑為data/data/包名,包名目錄下放置了應(yīng)用的獨立存儲區(qū)域媳板,一般情況下我們在Native Android的開發(fā)中會將應(yīng)用程序需要使用的一些資源文件桑腮,以及SharedPrefrence文件放置到files目錄中

    flutter應(yīng)用中:

    app_flutter 目錄放置flutter相關(guān)的資源文件
    cache目錄用于放置緩存文件由系統(tǒng)管理
    code_cache目錄放置flutter相關(guān)的代碼以及資源
    files目錄放置應(yīng)用需要使用到的資源文件,比如web資源等

    內(nèi)部存儲特點

    1. 只能由當(dāng)前應(yīng)用程序訪問相對安全蛉幸,但是如果設(shè)備Root之后則具有安全隱患
    2. 當(dāng)應(yīng)用卸載之后會進(jìn)行刪除破讨,不會占用額外的內(nèi)存丛晦,但是也需要考慮數(shù)據(jù)的生命周期,也不建議直接存儲用戶數(shù)據(jù)
    3. 不用申請權(quán)限可以直接使用
data.png
  • 外部存儲

    外部存儲主要是指設(shè)備的SD卡提陶,是整個設(shè)備共享的區(qū)域烫沙,由于其由安全風(fēng)險,所以需要申請外部文件讀寫權(quán)限才可使用

IOS的文件存儲

每個IOS程序都有一個獨立的文件存儲沙盒子區(qū)域隙笆,并且只能使用這部分進(jìn)行文件存儲锌蓄,外部無法進(jìn)行訪問,也無法操作外部

path_provider 的使用

如果在運行時提示

don't support null safety:

則需要添加 --no-sound-null-safety 即可忽略此錯誤

safe.png

getExternalStorageDirectory 可以獲取外部存儲撑柔,它返回一個Future對象瘸爽,他表示未來會返回內(nèi)容,所以在使用時需要"等等"它

Future<Directory> 

獲取并顯示外部存儲路徑

  getData() async {
    Directory d = await getExternalStorageDirectory();
    setState(() {
      path = d.path;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home'),
        centerTitle: true,
      ),
      body: Text(path)
    );
  }
path.png

記錄app每點擊一次記錄時間

class HomePageStates extends State<HomePage>
    with SingleTickerProviderStateMixin {
  String data = "";

  @override
  void initState() {
    super.initState();
  }

  getFile() async {
    Directory directory = await getExternalStorageDirectory();
    File file = File(directory.path + "/test");
    if (!file.existsSync()) {
      file.create();
    }
    return file;
  }

  readData() async {
    File file = await getFile();
    String str = await file.readAsString();
    setState(() {
      data = str;
    });
  }

  writeData() async {
    File file = await getFile();
    DateTime date = DateTime.now();
    file.writeAsStringSync(
        "${date.year}年${date.month}月${date.day}日${date.hour}時${date.minute}分${date.second}秒\n",
        mode: FileMode.append);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Home'),
          centerTitle: true,
        ),
        body: Container(
          alignment: Alignment.center,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('$data'),
              Ink(
                decoration: BoxDecoration(
                    color: Colors.blue,
                    borderRadius: BorderRadius.circular(20)),
                child: InkWell(
                  borderRadius: BorderRadius.circular(20),
                  onTap: () {
                    readData();
                  },
                  splashColor: Colors.white,
                  child: Container(
                    width: 100,
                    height: 40,
                    alignment: Alignment.center,
                    child: Text(
                      'Get',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
              Container(
                  margin: EdgeInsets.fromLTRB(0, 10, 0, 0),
                  child: Ink(
                decoration: BoxDecoration(
                    color: Colors.blue,
                    borderRadius: BorderRadius.circular(20)),
                child: InkWell(
                  borderRadius: BorderRadius.circular(20),
                  onTap: () {
                    writeData();
                  },
                  splashColor: Colors.white,
                  child: Container(
                    width: 100,
                    height: 40,
                    alignment: Alignment.center,
                    child: Text(
                      'Write',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ))
            ],
          ),
        ));
  }
}
device-2021-10-25-211114.png

SharedPrefrence

一般情況下在Android中我們最常用的是SharedPrefrence铅忿,一般用來保存一些狀態(tài)數(shù)據(jù)剪决,是否打開過引導(dǎo)頁,是否注冊過指紋等檀训,它是一種key,vakuexml格式的數(shù)據(jù),一般用來保存少量的數(shù)據(jù)昼捍,它是將內(nèi)容保存到了內(nèi)部存儲中也相對安全

添加依賴

shared_preferences: ^0.5.8

數(shù)據(jù)操作

  readData() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    bool enabled = preferences.getBool("is_touch_id_enabled");
    String time = preferences.getString("last openTime");
    setState(() {
      data = "$enabled-$time";
    });
  }

  writeData() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    DateTime date = DateTime.now();
    preferences.setBool("is_touch_id_enabled", true);
    preferences.setString("last openTime",
        "${date.year}年${date.month}月${date.day}日${date.hour}時${date
            .minute}分${date.second}秒\n");
  }
device-2021-10-26-185319.png

歡迎關(guān)注Mike的簡書

Android 知識整理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肢扯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌担锤,老刑警劉巖蔚晨,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肛循,居然都是意外死亡铭腕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門多糠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來累舷,“玉大人,你說我怎么就攤上這事夹孔”挥” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵搭伤,是天一觀的道長只怎。 經(jīng)常有香客問我,道長怜俐,這世上最難降的妖魔是什么身堡? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拍鲤,結(jié)果婚禮上贴谎,老公的妹妹穿的比我還像新娘汞扎。我一直安慰自己,他們只是感情好擅这,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布澈魄。 她就那樣靜靜地躺著,像睡著了一般蕾哟。 火紅的嫁衣襯著肌膚如雪一忱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天谭确,我揣著相機(jī)與錄音帘营,去河邊找鬼。 笑死逐哈,一個胖子當(dāng)著我的面吹牛芬迄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昂秃,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼禀梳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肠骆?” 一聲冷哼從身側(cè)響起算途,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚀腿,沒想到半個月后嘴瓤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡莉钙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年廓脆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磁玉。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡停忿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚊伞,到底是詐尸還是另有隱情席赂,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布厚柳,位于F島的核電站氧枣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏别垮。R本人自食惡果不足惜便监,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烧董,春花似錦毁靶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胳泉,卻和暖如春拐叉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扇商。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工凤瘦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人案铺。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓蔬芥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親控汉。 傳聞我的和親對象是個殘疾皇子笔诵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容