Flutter学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装
目录
- 简单介绍
- shared_preferences
- 安装 shared_preferences
- 简单效果
- 简单案例实现
- 关键代码
一、简单介绍
Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。
Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素。
1. shared_preferences
- 简介 :
shared_preferences
是一个简单的键值存储解决方案,适合存储少量数据,如用户偏好设置、配置信息等。 - 特点 :
- 简单易用 :提供简单的 API,如
setString
、getInt
等,方便保存和读取数据 - 数据类型支持 :支持常见的数据类型,如
String
、int
、bool
、double
等 - 异步操作 :所有操作都是异步的,不会阻塞主线程
- 简单易用 :提供简单的 API,如
- 适用场景 :适用于存储少量简单的键值对数据,不适合存储大量或复杂的数据
2. sqflite
- 简介 :
sqflite
是一个用于与 SQLite 数据库交互的 Flutter 插件,适合存储结构化数据 - 特点 :
- 结构化存储 :支持复杂的数据结构,可以存储大量数据
- SQL 支持 :通过 SQL 语句进行数据操作,适合复杂的查询和事务处理
- 持久化存储 :数据存储在本地数据库文件中,应用卸载后数据不会丢失
- 适用场景 :适用于需要存储大量结构化数据的应用,如待办事项、用户信息等
3. file
- 简介 :使用 Dart 的
File
类直接操作文件系统,适合存储自定义格式的数据 - 特点 :
- 直接操作 :可以直接读写文件,支持二进制文件和文本文件
- 灵活性高 :可以根据需要自定义数据格式和存储逻辑
- 适用场景 :适用于需要存储自定义格式数据(如 JSON 文件、二进制文件等)的应用
二、shared_preferences
shared_preferences
是 Flutter 中用于本地存储键值对数据的插件。它简单易用,适合存储少量数据,如用户偏好设置、配置信息等。通过 SharedPreferences.getInstance()
获取实例后,可使用 setString
、setInt
、setBool
等方法保存数据,用 getString
、getInt
、getBool
等方法获取数据,还可用 remove
删除指定键的数据。
对于iOS开发者,可以使用AppUploader这类工具来简化应用上传到App Store的过程,同时也能方便地管理应用的本地存储数据。
开发注意事项
- 异步操作 :
shared_preferences
的操作是异步的,需要使用await
或then
来处理结果 - 类型匹配 :保存和读取数据时,要确保类型一致
- 初始化检查 :在使用前,需确保实例已初始化完成
- 错误处理 :建议添加错误处理逻辑,避免应用崩溃
使用注意事项
- 存储容量限制 :适合存储少量数据,不适合存储大量数据
- 数据安全性 :数据是明文存储的,不适合存储敏感信息
- 数据持久性 :存储的数据会随着应用卸载而丢失
- 跨平台差异 :建议在不同平台上进行充分测试
三、安装 shared_preferences
- 直接运行命令:
flutter pub add shared_preferences
- 或者在 pubspec.yaml 添加:
dependencies:shared_preferences: ^2.5.2
四、简单案例实现
- 创建一个 Flutter 项目
- 编写一个 SharedPreferencesHelper
- 在 main 中测试
五、关键代码
SharedPreferencesHelper
import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesHelper {static Future<void> saveData<T>(String key, T value) async {final prefs = await SharedPreferences.getInstance();if (value is String) {await prefs.setString(key, value);} else if (value is int) {await prefs.setInt(key, value);} else if (value is bool) {await prefs.setBool(key, value);} else if (value is double) {await prefs.setDouble(key, value);} else {throw Exception('Unsupported type');}}static Future<T?> getData<T>(String key) async {final prefs = await SharedPreferences.getInstance();if (T == String) {return prefs.getString(key) as T?;} else if (T == int) {return prefs.getInt(key) as T?;} else if (T == bool) {return prefs.getBool(key) as T?;} else if (T == double) {return prefs.getDouble(key) as T?;} else {throw Exception('Unsupported type');}}static Future<void> removeData(String key) async {final prefs = await SharedPreferences.getInstance();await prefs.remove(key);}static Future<bool> containsKey(String key) async {final prefs = await SharedPreferences.getInstance();return prefs.containsKey(key);}
}
main.dart
import 'package:flutter/material.dart';
import 'package:test_shared_preferences/shared_preferences_helper.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget { Widget build(BuildContext context) {return MaterialApp(home: HomeScreen(),);}
}class HomeScreen extends StatefulWidget { _HomeScreenState createState() => _HomeScreenState();
}class _HomeScreenState extends State<HomeScreen> {final _controller = TextEditingController();String _savedValue = '';void initState() {super.initState();_loadSavedValue();}Future _loadSavedValue() async {final value = await SharedPreferencesHelper.getData<String>('my_key');setState(() {_savedValue = value ?? '';_controller.text = _savedValue;});}void _saveValue() async {final value = _controller.text;await SharedPreferencesHelper.saveData('my_key', value);setState(() {_savedValue = value;});} Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('SharedPreferences Example'),),body: Padding(padding: EdgeInsets.all(16.0),child: Column(children: [TextField(controller: _controller,decoration: InputDecoration(labelText: 'Enter a value'),),ElevatedButton(onPressed: _saveValue,child: Text('Save'),),Text('Saved Value: $_savedValue'),],),),);}
}
对于iOS开发者,在完成Flutter应用的开发后,可以使用AppUploader来简化应用上传到App Store的过程,同时也能方便地管理应用的本地存储数据。