flutter:用shared_preferences保存数据到本地

一,安装第三方库:

库地址:

https://pub.dev/packages/shared_preferences

编辑pubspec.yaml

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.5.2

然后点 pub get 下载

二,代码:

1,封装类

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);
  }

  /// 判断 key 是否存在
  // 参数:
  // - key: 要判断的键
  // 返回值:
  // - 如果 key 存在,返回对应的 true;否则返回 false
  static Future<bool> containsKey(String key) async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.containsKey(key);
  }
}

2,页面:

import 'package:flutter/material.dart';
import 'dart:convert';
import 'package:demo3/common/SharedPreferencesHelper.dart';
import 'package:fluttertoast/fluttertoast.dart';

class PreferencePage extends StatefulWidget {
  final Map arguments;

  // 为title设置一个默认参数,这样的跳转该界面时可以不传值。
  PreferencePage({super.key, required this.arguments});
  @override
  State<PreferencePage> createState() => _PreferencePageState();
}

class _PreferencePageState extends State<PreferencePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.primaryContainer,
        title: Text(widget.arguments["title"]),
      ),



      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () async {
                String value="夜凉疑有雨,院静似无僧";
                await SharedPreferencesHelper.saveData('my_key', value);

              },
              child: Row(
                mainAxisSize: MainAxisSize.min, // 根据内容调整大小
                children: <Widget>[
                  Icon(Icons.add), // 图标在左侧
                  SizedBox(width: 10), // 可选:添加一些间隔
                  Text("写入数据"), // 文本在右侧
                ],
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async{

                final value = await SharedPreferencesHelper.getData<String>('my_key');
                print("保存的字符串:");
                print(value);
                //用toast显示:
                Fluttertoast.showToast(
                  msg: "读取到的内容:"+value.toString(),
                  toastLength: Toast.LENGTH_LONG,
                  gravity: ToastGravity.CENTER,
                  timeInSecForIosWeb: 1,
                  backgroundColor: Colors.red,
                  textColor: Colors.white,
                  fontSize: 16.0,
                  //duration
                );
              },
              child: Row(
                mainAxisSize: MainAxisSize.min, // 根据内容调整大小
                children: <Widget>[
                  Icon(Icons.add), // 图标在左侧
                  SizedBox(width: 10), // 可选:添加一些间隔
                  Text("读取数据"), // 文本在右侧
                ],
              ),
            ),
          ],
        ),
      ),



    );
  }
}

三,测试效果:

 

posted @ 2025-04-04 13:11  刘宏缔的架构森林  阅读(92)  评论(0)    收藏  举报