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 添加:
yaml
dependencies:
shared_preferences: ^2.5.2
四、简单案例实现
- 创建一个 Flutter 项目
- 编写一个 SharedPreferencesHelper
- 在 main 中测试
五、关键代码
SharedPreferencesHelper
dart
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
dart
import 'package:flutter/material.dart';
import 'package:test_shared_preferences/shared_preferences_helper.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomeScreen(),
);
}
}
class HomeScreen extends StatefulWidget {
@override
_HomeScreenState createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final _controller = TextEditingController();
String _savedValue = '';
@override
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;
});
}
@override
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的过程,同时也能方便地管理应用的本地存储数据。