Flutter偏好设置管理插件sp_util的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

Flutter偏好设置管理插件sp_util的使用

sp_util

Pub Pub

sp_util 是一个用于Flutter项目的共享偏好设置插件,它简化了SharedPreferences的使用,支持获取默认值、保存对象和对象列表。以下是其主要功能和使用方法。

Pub配置

pubspec.yaml文件中添加依赖:

dependencies:
  sp_util: ^2.0.3

API接口

  • getObj, getObjList, putObject, getObject, putObjectList, getObjectList
  • getString, putString
  • getBool, putBool
  • getInt, putInt
  • getDouble, putDouble
  • getStringList, putStringList
  • getDynamic
  • haveKey
  • getKeys
  • remove
  • clear
  • reload
  • isInitialized

示例代码

初始化与基本用法

确保在应用启动前完成SpUtil的初始化。这通常是在main()函数中进行异步等待。

import 'package:flutter/material.dart';
import 'package:sp_util/sp_util.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await SpUtil.getInstance();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  String spLastCounter = 'last_counter';

  void _incrementCounter() {
    setState(() {
      _counter++;
      SpUtil.putInt(spLastCounter, _counter);
    });
  }

  @override
  void initState() {
    super.initState();

    // 使用sp读取上次计数
    _counter = SpUtil.getInt(spLastCounter, defValue: 0)!;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

对象存储示例

除了简单的数据类型外,sp_util还支持复杂的对象和对象列表的存储与读取。

class City {
  String name;

  City({required this.name});

  factory City.fromJson(Map<String, dynamic> json) => City(name: json['name']);
  
  Map<String, dynamic> toJson() => {'name': name};
}

// 存储单个对象
City city = City(name: "成都市");
SpUtil.putObject("loc_city", city);

// 读取单个对象
City? hisCity = SpUtil.getObj("loc_city", (v) => City.fromJson(v as Map<String, dynamic>));
print("City: " + (hisCity == null ? "null" : hisCity.toString()));

// 存储对象列表
List<City> list = [];
list.add(City(name: "成都市"));
list.add(City(name: "北京市"));
SpUtil.putObjectList("loc_city_list", list);

// 读取对象列表
List<City>? dataList = SpUtil.getObjList("loc_city_list", (v) => City.fromJson(v as Map<String, dynamic>));
print("CityList: " + (dataList == null ? "null" : dataList.toString()));

通过上述内容,您可以轻松地在Flutter项目中集成并使用sp_util来管理和持久化应用程序的数据。此外,如果您需要更多工具类的支持,可以考虑引入common_utilsflustars库。


更多关于Flutter偏好设置管理插件sp_util的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter偏好设置管理插件sp_util的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用sp_util(SharedPreferences的封装插件)来管理偏好设置的代码示例。

首先,确保你已经在pubspec.yaml文件中添加了sp_util依赖:

dependencies:
  flutter:
    sdk: flutter
  sp_util: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来获取依赖。

使用示例

  1. 初始化并设置偏好设置
import 'package:flutter/material.dart';
import 'package:sp_util/sp_util.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SP Util Demo'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _savedValue = '';

  @override
  void initState() {
    super.initState();
    // 初始化时读取偏好设置
    _readFromPreferences();
  }

  Future<void> _readFromPreferences() async {
    String? value = await SpUtil.getString('my_key');
    setState(() {
      _savedValue = value ?? '';
    });
  }

  Future<void> _saveToPreferences(String value) async {
    await SpUtil.putString('my_key', value);
    setState(() {
      _savedValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Saved Value: $_savedValue'),
        SizedBox(height: 20),
        TextField(
          decoration: InputDecoration(labelText: 'Enter a value'),
          onChanged: (value) {
            // 在这里你也可以实时保存值,或者仅在提交时保存
          },
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () {
            final textController = TextEditingController();
            // 这里应该使用TextField的controller来获取值,但为了简化,我们使用一个示例值
            textController.text = _savedValue; // 这里应该通过某种方式获取TextField的值
            _saveToPreferences(textController.text);
          },
          child: Text('Save'),
        ),
      ],
    );
  }
}

注意:上面的代码示例中,TextField的值获取部分被简化了,实际使用中应该通过TextEditingController或其他方式获取用户输入的值。

  1. 支持其他类型的数据

sp_util还支持其他类型的数据存储,如整型、布尔型、双精度浮点型、列表和映射。以下是一些示例:

// 保存整型
await SpUtil.putInt('my_int_key', 42);
int? intValue = await SpUtil.getInt('my_int_key');

// 保存布尔型
await SpUtil.putBool('my_bool_key', true);
bool? boolValue = await SpUtil.getBool('my_bool_key');

// 保存双精度浮点型
await SpUtil.putDouble('my_double_key', 3.14);
double? doubleValue = await SpUtil.getDouble('my_double_key');

// 保存列表
await SpUtil.putStringList('my_list_key', ['a', 'b', 'c']);
List<String>? listValue = await SpUtil.getStringList('my_list_key');

// 保存映射
await SpUtil.putMap('my_map_key', {'key1': 'value1', 'key2': 'value2'});
Map<String, String>? mapValue = await SpUtil.getMap<String, String>('my_map_key');

以上代码展示了如何使用sp_util来管理Flutter应用中的偏好设置。通过这些方法,你可以轻松地在应用的不同部分之间共享和存储数据。

回到顶部