flutter%20%E4%BD%BF%E7%94%A8%20shared_preferences%20%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%AC%E5%9C%B0%E5%8C%96%E4%BF%9D%E5%AD%98%E5%B0%81%E8%A3%85" name="Flutter%20%E5%AD%A6%E4%B9%A0%E4%B9%8B%E6%97%85%20%E4%B9%8B%20flutter%20%E4%BD%BF%E7%94%A8%20shared_preferences%20%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%AC%E5%9C%B0%E5%8C%96%E4%BF%9D%E5%AD%98%E5%B0%81%E8%A3%85">Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装
目录
flutter%20%E4%BD%BF%E7%94%A8%20shared_preferences%20%E5%AE%9E%E7%8E%B0%E7%AE%80%E5%8D%95%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9C%AC%E5%9C%B0%E5%8C%96%E4%BF%9D%E5%AD%98%E5%B0%81%E8%A3%85-toc" name="tableOfContents" style="margin-left:0px">Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装
一、简单介绍
2. sqflite
3. file
开发注意事项
使用注意事项
flutter-toc" name="tableOfContents" style="margin-left:80px">三、安装 shared_preferences
四、简单效果
五、简单案例实现
六、关键代码
一、简单介绍
Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。
Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自定义的、适应性强的设计,这些设计在任何屏幕上都能呈现出色的外观和感觉。
1. shared_preferences
简介:
shared_preferences
是一个简单的键值存储解决方案,适合存储少量数据,如用户偏好设置、配置信息等。特点:
2.
sqflite
特点:
适用场景:适用于需要存储大量结构化数据的应用,如待办事项、用户信息等。
3. file
二、shared_preferences
官网地址:shared_preferences | Flutter package
shared_preferences
是 Flutter 中用于本地存储键值对数据的插件。它简单易用,适合存储少量数据,如用户偏好设置、配置信息等。通过 SharedPreferences.getInstance()
获取实例后,可使用 setString
、setInt
、setBool
等方法保存数据,用 getString
、getInt
、getBool
等方法获取数据,还可用 remove
删除指定键的数据。它基于平台的本地存储机制,如 Android 的 SharedPreferences 和 iOS 的 UserDefaults,数据存储在设备本地,应用卸载后数据会丢失。
在开发和使用
shared_preferences
时,需要注意以下几点:开发注意事项
异步操作:
shared_preferences
的操作是异步的,需要使用await
或then
来处理结果,避免数据未保存或读取完成就执行后续逻辑。类型匹配:保存和读取数据时,要确保类型一致。例如,保存时使用
setInt
,读取时必须用getInt
,否则会报错。初始化检查:在使用
shared_preferences
前,需确保实例已初始化完成,通常通过await SharedPreferences.getInstance()
来获取实例。错误处理:操作过程中可能会出现错误(如存储空间不足等),建议添加错误处理逻辑,避免应用崩溃。
使用注意事项
flutter" name="%E4%B8%89%E3%80%81%E5%AE%89%E8%A3%85%20webview_flutter">三、安装 shared_preferences
1、直接运行命令:flutter pub add shared_preferences
2、或者在 pubspec.yaml 添加
dependencies:shared_preferences: ^2.5.2
四、简单效果
五、简单案例实现
1、这里使用 Android Studio 进行创建 Flutter 项目
2、创建一个 application 的 Flutter 项目
3、编写一个 SharedPreferencesHelper
4、在 main 中测试
5、连接设备,运行效果如下
六、关键代码
1、SharedPreferencesHelper
import 'package:shared_preferences/shared_preferences.dart';class SharedPreferencesHelper {// 保存数据到 SharedPreferences// 参数:// - key: 存储的键// - value: 要保存的值,支持 String、int、bool、double 类型// 异常:// - 如果 value 的类型不支持,会抛出异常static Future<void> saveData<T>(String key, T value) async {// 获取 SharedPreferences 实例final prefs = await SharedPreferences.getInstance();// 根据 value 的类型调用不同的保存方法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 {// 如果 value 的类型不支持,抛出异常throw Exception('Unsupported type');}}// 从 SharedPreferences 获取数据// 参数:// - key: 存储的键// - T: 指定返回值的类型,必须是 String、int、bool、double 中的一种// 返回值:// - 如果 key 存在,返回对应的值;否则返回 null// 异常:// - 如果 T 不是支持的类型,会抛出异常static Future<T?> getData<T>(String key) async {// 获取 SharedPreferences 实例final prefs = await SharedPreferences.getInstance();// 根据 T 的类型调用不同的获取方法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 {// 如果 T 不是支持的类型,抛出异常throw Exception('Unsupported type');}}// 从 SharedPreferences 删除指定的键值对// 参数:// - key: 要删除的键static Future<void> removeData(String key) async {// 获取 SharedPreferences 实例final prefs = await SharedPreferences.getInstance();// 删除指定的键值对await prefs.remove(key);}
}
代码说明
saveData
方法
通过
SharedPreferences.getInstance()
获取实例。根据
value
的类型调用对应的保存方法(setString
、setInt
等)。如果
value
的类型不支持,抛出异常。
getData
方法
通过
SharedPreferences.getInstance()
获取实例。根据泛型参数
T
的类型调用对应的获取方法(getString
、getInt
等)。如果键不存在,返回
null
。如果
T
的类型不支持,抛出异常。
removeData
方法
通过
SharedPreferences.getInstance()
获取实例。调用
remove
方法删除指定的键值对。这些注释可以帮助开发者快速理解每个方法的功能和使用方式,避免常见错误。
2、main
import 'package:flutter/material.dart';
import 'package:test_shared_preferences/shared_preferences_helper.dart';void main() {runApp(MyApp());
}// MyApp 是整个应用的入口,继承自 StatelessWidget
class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// 使用 MaterialApp 创建一个简单的 Flutter 应用return MaterialApp(home: HomeScreen(), // 设置应用的首页为 HomeScreen);}
}// HomeScreen 是应用的主页,继承自 StatefulWidget
// 因为需要在页面中保存和加载数据,所以需要使用 StatefulWidget
class HomeScreen extends StatefulWidget {@override_HomeScreenState createState() => _HomeScreenState();
}// _HomeScreenState 是 HomeScreen 的状态类
class _HomeScreenState extends State<HomeScreen> {final _controller = TextEditingController(); // 创建一个 TextEditingController,用于控制 TextFieldString _savedValue = ''; // 用于存储从 SharedPreferences 中加载的值@overridevoid initState() {super.initState();_loadSavedValue(); // 在页面初始化时加载保存的值}// _loadSavedValue 是一个异步方法,用于从 SharedPreferences 中加载数据Future _loadSavedValue() async {final value = await SharedPreferencesHelper.getData<String>('my_key'); // 从 SharedPreferences 中获取键为 'my_key' 的值setState(() {_savedValue = value ?? ''; // 如果值为空,则默认为空字符串_controller.text = _savedValue; // 将加载的值设置到 TextField 的控制器中});}// _saveValue 是一个方法,用于将用户输入的值保存到 SharedPreferences 中void _saveValue() async {final value = _controller.text; // 获取 TextField 中的值await SharedPreferencesHelper.saveData('my_key', value); // 将值保存到 SharedPreferences 中,键为 'my_key'setState(() {_savedValue = value; // 更新保存的值});}@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('SharedPreferences Example'), // 设置应用栏标题),body: Padding(padding: EdgeInsets.all(16.0), // 设置页面的内边距child: Column(children: [TextField(controller: _controller, // 将控制器绑定到 TextFielddecoration: InputDecoration(labelText: 'Enter a value'), // 设置 TextField 的装饰,显示提示文本),ElevatedButton(onPressed: _saveValue, // 点击按钮时调用 _saveValue 方法child: Text('Save'), // 设置按钮的文本),Text('Saved Value: $_savedValue'), // 显示保存的值],),),);}
}
代码说明
MyApp
类
是整个应用的入口,使用
MaterialApp
创建一个简单的 Flutter 应用,并设置首页为HomeScreen
。
HomeScreen
类
是应用的主页,继承自
StatefulWidget
,因为需要在页面中保存和加载数据,所以需要使用StatefulWidget
。
_HomeScreenState
类
是
HomeScreen
的状态类,包含以下功能:
使用
_controller
控制TextField
,方便获取用户输入的值。在页面初始化时调用
_loadSavedValue
方法,从SharedPreferences
中加载保存的值。
_loadSavedValue
方法是异步的,从SharedPreferences
中获取键为'my_key'
的值,并更新_savedValue
和_controller.text
。
_saveValue
方法将用户输入的值保存到SharedPreferences
中,键为'my_key'
,并更新_savedValue
。页面布局包含一个
TextField
用于输入值,一个ElevatedButton
用于保存值,以及一个Text
用于显示保存的值。通过这些注释,开发者可以快速理解代码的结构和功能,方便后续的开发和维护。