Flutter 本地持久化存儲:Hive 與 SharedPreferences 實戰對比

在移動應用開發中,本地持久化存儲是必不可少的功能。無論是保存用戶登錄狀態、應用配置,還是緩存數據,合理選擇存儲方案都能提高應用的性能與用戶體驗。

在 Flutter 中,常用的本地存儲方式主要有兩種:SharedPreferencesHive

本文將帶你快速了解這兩種方式的特點,并通過簡單的 Demo 展示如何使用它們。


🔹 1. SharedPreferences

1.1 簡介

SharedPreferences 是 Flutter 提供的輕量級存儲方式,底層使用 Key-Value 形式存儲,適合存儲少量配置信息。

1.2 使用步驟

  1. 添加依賴

# pubspec.yaml
dependencies:shared_preferences: ^2.2.2
  1. 示例代碼

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesDemo extends StatefulWidget {@override_SharedPreferencesDemoState createState() => _SharedPreferencesDemoState();
}class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {String _username = "";Future<void> _saveData() async {final prefs = await SharedPreferences.getInstance();await prefs.setString("username", "FlutterUser");setState(() {_username = "FlutterUser";});}Future<void> _loadData() async {final prefs = await SharedPreferences.getInstance();setState(() {_username = prefs.getString("username") ?? "暫無數據";});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("SharedPreferences Demo")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text("用戶名:$_username"),ElevatedButton(onPressed: _saveData,child: Text("保存數據"),),ElevatedButton(onPressed: _loadData,child: Text("讀取數據"),),],),),);}
}

🔹 2. Hive

2.1 簡介

Hive 是 Flutter 社區非常流行的 NoSQL 本地數據庫,支持持久化存儲、加密和復雜數據結構,性能優于 SharedPreferences

2.2 使用步驟

  1. 添加依賴

# pubspec.yaml
dependencies:hive: ^2.2.3hive_flutter: ^1.1.0# 如果要存儲復雜對象
# dev_dependencies:
#   hive_generator: ^2.0.1
#   build_runner: ^2.3.3
  1. 初始化 Hive

import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';void main() async {WidgetsFlutterBinding.ensureInitialized();await Hive.initFlutter();await Hive.openBox("settings");runApp(MyApp());
}class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {return MaterialApp(title: "Hive Demo",home: HiveDemo(),);}
}class HiveDemo extends StatefulWidget {@override_HiveDemoState createState() => _HiveDemoState();
}class _HiveDemoState extends State<HiveDemo> {final box = Hive.box("settings");String _username = "暫無數據"; // 本地存儲的用戶名void _saveData() {box.put("username", "HiveUser");setState(() {_username = "HiveUser"; // 立即更新 UI});}void _loadData() {final value = box.get("username", defaultValue: "暫無數據");setState(() {_username = value;});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Hive Demo")),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Text("用戶名:$_username"),ElevatedButton(onPressed: _saveData,child: Text("保存數據"),),ElevatedButton(onPressed: _loadData,child: Text("讀取數據"),),],),),);}
}

2.3 封裝 HiveService(存儲數組示例)

在實際項目中,為了方便調用,可以對 Hive 進行二次封裝,例如存儲數組:

import 'package:hive/hive.dart';class HiveService {Future<void> saveArray(String key, List<dynamic> array) async {var box = await Hive.openBox('myBox');await box.put(key, array); // 保存數組}Future<List<dynamic>> getArray(String key) async {var box = await Hive.openBox('myBox');return box.get(key, defaultValue: []); // 獲取數組,默認值為空列表}
}

這樣,我們只需調用 HiveService().saveArray("users", ["張三", "李四"]) 即可保存數組,調用 HiveService().getArray("users") 即可獲取,十分方便。


🔹 3. 對比總結

特性SharedPreferencesHive
存儲方式Key-ValueNoSQL 本地數據庫
適用場景配置項、布爾開關、少量數據列表、對象、大量本地數據
性能適合輕量存儲高性能,支持大規模數據存儲
數據類型基礎類型(String/Int/Bool)支持復雜對象和數組
易用性簡單易上手初學需要配置,但功能更強大
加密支持支持 AES 加密

? 結論

  • 如果只是存儲登錄狀態或主題設置,用 SharedPreferences 就夠了。

  • 如果需要存儲數組、對象或大量數據,推薦使用 Hive,并可通過封裝服務類提高代碼復用性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95069.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Lombok 實用注解深度解析!

目錄一、AllArgsConstructor&#xff1a;全參數構造函數生成器1. 基本概念2. 使用示例3. 高級特性4. 注意事項二、RequiredArgsConstructor&#xff1a;必需參數構造函數生成器1. 基本概念2. 使用示例3. 高級特性4. 注意事項三、SneakyThrows&#xff1a;異常處理"偷懶&qu…

Go+Gdal 完成高性能GIS數據空間分析

概要 環境準備 技術流程 一、在golang中如何調用gdal 二、讀取數據 三、執行空間分析 四、性能提升 小結 概要 Gdal庫可以說是所有gis軟件的基礎&#xff0c;基本上現在所有的工業gis軟件都是基于gdal開發的&#xff0c;其主要包括了柵格處理、矢量處理、坐標系處理所涉及的各類…

【python】python進階——Lambda 函數

目錄 引言 一、簡介 1.1 基本語法 1.2 優勢 1.3 局限性 二、基本用法 2.1 無參數lambda 函數 2.2 多參數 lambda 函數 三、常見使用場景 3.1 與高階函數配合使用 3.2 作為排序鍵 3.3 在 GUI 編程中作為回調函數 3.4 在 Pandas 中的應用 四、高級技巧 4.1 條件表…

基于單片機電動車充電樁/充電車棚環境監測設計

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 隨著電動車普及&#xff0c;充電樁的環境安全監測成為重要課題。基于單片機的電動車充電樁環境檢…

Linux初始——編譯器gcc

編譯器gcc編譯器編譯器自舉動靜態庫動靜態庫的差異gcc編譯器 眾所周知&#xff0c;代碼運行的前提是經過四個步驟的 預處理&#xff0c;其進行宏替換&#xff0c;去注釋&#xff0c;條件編譯&#xff0c;頭文件展開的工作&#xff0c;在gcc的選項中對應gcc -E&#xff0c;其就…

Three.js + AI預測:在數字孿生中實現數據可視化智能決策

某智慧工廠的數字孿生系統曾陷入尷尬&#xff1a;3D 模型里的生產線數據實時跳動&#xff0c;卻沒人能預判 “2 小時后哪臺機器會停機”。這就像有了高清監控&#xff0c;卻不會分析監控畫面 ——Three.js 做出的可視化是 “眼睛”&#xff0c;AI 預測才是 “大腦”。不少團隊用…

刀客doc:亞馬遜持續猛攻程序化廣告

文/刀客doc(頭條深一度精選作者)一7月的尾聲和8月的開端&#xff0c;廣告市場見證了兩場截然不同的場面。7月31日&#xff0c;亞馬遜公布了截至6月30日的2025年第二季度財報。廣告業務表現尤為亮眼&#xff1a;單季收入達到157億美元&#xff0c;同比增長約22%&#xff0c;成為…

政府網站IPv6檢測怎么做?檢測指標有哪些?

隨著信息技術的飛速發展&#xff0c;IPv6作為下一代互聯網的核心協議&#xff0c;已成為全球互聯網發展的必然趨勢。我國政府高度重視IPv6的規模部署和應用推廣&#xff0c;明確要求各級政府網站必須完成IPv6改造&#xff0c;以提升網絡基礎設施的現代化水平&#xff0c;增強網…

有N個控制點的三次B樣條曲線轉化為多段三階Bezier曲線的方法

將具有N 個控制點的三次B樣條曲線轉換為多段三階Bezier曲線&#xff0c;是計算機圖形學和CAD系統中常見的操作。這種轉換基于B樣條曲線的局部性質以及其與Bezier曲線之間的關系。基本原理三次B樣條曲線由一組控制點 P?, P?, ..., P??? 和一個節點向量 U {u?, u?, ..., …

chrome好用的瀏覽器插件

https://ad.infread.com/?utm_sourcebaidu_sem&utm_mediumweb_pc&utm_campaignkeywords_website_translate&bd_vid2831968530895394443 目前我自己覺得比較用的谷歌瀏覽器翻譯插件->沉浸式翻譯 個人覺得無論時速度還是準確度都是比較好的

k8s---prometheus 監控

目錄 環境準備 下載 kube-prometheus 軟件包 下載prometheus 鏡像 master節點 master節點導入prometheus軟件包 解壓 node節點 node節點導入鏡像 解壓 從tar包中加載鏡像 部署 prometheus 修改映射端口 提交 查看pod pod和svc正常啟動 deployment daemonset se…

華大時空組學空轉圖像處理

華大時空組學空轉圖像處理 library(png) library(tiff) st <- readRDS(01.Stereo-seq/output_all/Demo_Mouse_Kidney/outs/feature_expression/seurat_out.rds) dim(stassays$Spatialcounts) stassays$Spatialcounts[1:4,1:4] coord.df <- data.frame(imagerow st$x, im…

如何在SptingBoot項目中引入swagger生成API文檔

目錄 背景介紹&#xff0c;swagger的必要性 swagger的引入&#xff1a; 1.首先我們需要在 pom.xml文件中導入jar包 2.給swagger創建一個配置類&#xff1a; 3.為實體類添加注解 4.為controller添加注解 背景介紹&#xff0c;swagger的必要性 自從在2005年前端工程師誕生之…

GD32入門到實戰21--輸入捕獲

我們新建capture_drv.c#include <stdint.h> #include <stdio.h> #include "gd32f30x.h" #include "delay.h"static void GpioInit(void) {rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_10MHZ,GPIO…

MyBatis 與 MyBatis-Plus 的對比與選擇

&#x1f50d; MyBatis 與 MyBatis-Plus 的對比與選擇 文章目錄&#x1f50d; MyBatis 與 MyBatis-Plus 的對比與選擇&#x1f9e0; 一、MyBatis 核心回顧&#x1f4a1; 核心思想與架構定位? 基礎使用示例?? MyBatis 的痛點? 二、MyBatis-Plus 功能特性解析&#x1f4a1; M…

大數據-湖倉一體

數據倉庫 這是一個傳統的概念了&#xff0c;趨向于結構化數據&#xff0c;簡單來說就是進過數據治理后的標準數據更易于數據分析使用&#xff0c;代價就是存儲比較昂貴了 數據湖 近些年來新出的一種概念&#xff0c;就是存儲了結構化&#xff0c;非結構化&#xff0c;半結構…

Java視覺跟蹤入門:使用OpenCV實現實時對象追蹤

視覺跟蹤是計算機視覺領域的一個重要分支&#xff0c;它允許我們在視頻序列中持續定位移動對象。本文將介紹如何使用Java和OpenCV庫來實現一個簡單的視覺跟蹤系統。什么是視覺跟蹤&#xff1f;視覺跟蹤是指通過分析視頻幀來自動追蹤一個或多個移動對象的過程。這項技術廣泛應用…

【題解 | 兩種做法】洛谷 P4208 [JSOI2008] 最小生成樹計數 [矩陣樹/枚舉]

特別難調&#xff0c;洛谷題解區很多人代碼可讀性不強&#xff0c;做的我懷疑人生。 &#xff08;雖然我的碼風也一般就是了&#xff09; 前置知識&#xff1a; Kruskal 求最小生成樹。 題面&#xff1a; 洛谷 P4208 兩種做法&#xff0c;一種矩陣樹一種枚舉。 &#xff08…

光譜相機多層鍍膜技術如何提高透過率

光譜相機多層鍍膜技術通過精密的光學設計與材料組合實現透過率提升&#xff0c;其核心原理與技術特性如下&#xff1a;一、多層鍍膜的光學優化機制?復合相位調控? 通過交替沉積高折射率&#xff08;如TiO?, n2.3&#xff09;與低折射率材料&#xff08;如SiO?, n1.46&#…

ubantu安裝配置hive

在Ubuntu系統上安裝Hive通常涉及幾個步驟&#xff0c;包括安裝Java&#xff08;因為Hive依賴于Java&#xff09;&#xff0c;安裝Hadoop&#xff0c;然后安裝Hive本身。以下是一個基本的步驟指南&#xff1a; 安裝Java 首先&#xff0c;確保你的系統上安裝了Java。你可以通過運…