Flutter 学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装

Flutter学习之旅 之 flutter 使用 shared_preferences 实现简单的数据本地化保存封装

目录

  1. 简单介绍
  2. shared_preferences
  3. 安装 shared_preferences
  4. 简单效果
  5. 简单案例实现
  6. 关键代码

一、简单介绍

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者使用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。

Flutter 使用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 机器代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素。

1. shared_preferences

  • 简介shared_preferences 是一个简单的键值存储解决方案,适合存储少量数据,如用户偏好设置、配置信息等。
  • 特点
    • 简单易用 :提供简单的 API,如 setStringgetInt 等,方便保存和读取数据
    • 数据类型支持 :支持常见的数据类型,如 Stringintbooldouble
    • 异步操作 :所有操作都是异步的,不会阻塞主线程
  • 适用场景 :适用于存储少量简单的键值对数据,不适合存储大量或复杂的数据

2. sqflite

  • 简介sqflite 是一个用于与 SQLite 数据库交互的 Flutter 插件,适合存储结构化数据
  • 特点
    • 结构化存储 :支持复杂的数据结构,可以存储大量数据
    • SQL 支持 :通过 SQL 语句进行数据操作,适合复杂的查询和事务处理
    • 持久化存储 :数据存储在本地数据库文件中,应用卸载后数据不会丢失
  • 适用场景 :适用于需要存储大量结构化数据的应用,如待办事项、用户信息等

3. file

  • 简介 :使用 Dart 的 File 类直接操作文件系统,适合存储自定义格式的数据
  • 特点
    • 直接操作 :可以直接读写文件,支持二进制文件和文本文件
    • 灵活性高 :可以根据需要自定义数据格式和存储逻辑
  • 适用场景 :适用于需要存储自定义格式数据(如 JSON 文件、二进制文件等)的应用

二、shared_preferences

shared_preferences 是 Flutter 中用于本地存储键值对数据的插件。它简单易用,适合存储少量数据,如用户偏好设置、配置信息等。通过 SharedPreferences.getInstance() 获取实例后,可使用 setStringsetIntsetBool 等方法保存数据,用 getStringgetIntgetBool 等方法获取数据,还可用 remove 删除指定键的数据。

对于iOS开发者,可以使用AppUploader这类工具来简化应用上传到App Store的过程,同时也能方便地管理应用的本地存储数据。

开发注意事项

  1. 异步操作shared_preferences 的操作是异步的,需要使用 awaitthen 来处理结果
  2. 类型匹配 :保存和读取数据时,要确保类型一致
  3. 初始化检查 :在使用前,需确保实例已初始化完成
  4. 错误处理 :建议添加错误处理逻辑,避免应用崩溃

使用注意事项

  1. 存储容量限制 :适合存储少量数据,不适合存储大量数据
  2. 数据安全性 :数据是明文存储的,不适合存储敏感信息
  3. 数据持久性 :存储的数据会随着应用卸载而丢失
  4. 跨平台差异 :建议在不同平台上进行充分测试

三、安装 shared_preferences

  1. 直接运行命令:

    flutter pub add shared_preferences

  2. 或者在 pubspec.yaml 添加:

yaml 复制代码
dependencies:
  shared_preferences: ^2.5.2

四、简单案例实现

  1. 创建一个 Flutter 项目
  2. 编写一个 SharedPreferencesHelper
  3. 在 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的过程,同时也能方便地管理应用的本地存储数据。

相关推荐
codingandsleeping5 小时前
HTTP1.0、1.1、2.0 的区别
前端·网络协议·http
张太行_7 小时前
UDP目标IP不存在时的发送行为分析
网络协议·tcp/ip·udp
Orig1nal8 小时前
第七届浙江省大学生网络与信息安全竞赛决赛Unserialize深度解析 1.0
网络安全
SlientICE8 小时前
TCP是什么?不需要!使用ESP32网络层直接通信!
网络·单片机·网络协议·tcp/ip
帽儿山的枪手8 小时前
通过网络命名空间实现网络分流的思想及方法
网络协议·docker·dns
sky.fly8 小时前
在思科模拟器show IP route 发现Gateway of last resort is not set没有设置最后的通道
网络协议·tcp/ip·gateway
小李超勇的..10 小时前
SOME/IP
网络·网络协议·tcp/ip
EasyDSS10 小时前
WebRTC实时通话EasyRTC嵌入式音视频通信SDK,构建智慧医疗远程会诊高效方案
大数据·网络·网络协议·音视频
群联云防护小杜11 小时前
隐藏源站IP与SD-WAN回源优化:高防架构的核心实践
网络·分布式·网络协议·tcp/ip·安全·架构·ddos