Flutter类型化数据存储插件shared_preferences_typed的使用

Flutter类型化数据存储插件shared_preferences_typed的使用

Typed Shared Preferences

pub package

这是一个对shared_preferences进行类型安全包装的库,灵感来源于ts-localstorage

为什么使用?

  • Dart编译器现在可以防止你在int键上写入一个bool
  • 你可以将所有与SharedPreferences相关的配置组织在一个文件中,而不仅仅是字符串键。
  • 你不再需要在任何地方调用SharedPreferences.getInstance()

使用方法

  • 创建一个PrefKeyPrefKeyNullable,传入一个字符串作为键和一个默认值。当SharedPreferences中不存在该值时,默认值会被返回。
  • 对于PrefKeyNullable,尽管默认值不是实际使用的地方,但它仍被要求以保证类型安全。

查看test/shared_preferences_typed_test.dart获取更详细的示例,以下是常用示例:

基本示例(非可空)

/// 描述
const key = PrefKey("some_key", true);

final valueBefore = await key.read(); // -> true (默认值)
await key.write(false); // -> 值现在为false

基本示例(可空)

/// 描述
const key = PrefKeyNullable("some_key", true);

final valueBefore = await key.read(); // -> null
await key.write(false); // -> 值现在为false

使用现有SharedPreferences实例(非可空)

final prefs = await SharedPreferences.getInstance();

/// 描述
const key = PrefKey("some_key", true);

final valueBefore = await key.readSync(prefs); // -> true (默认值)
await key.write(false); // -> 值现在为false

使用现有SharedPreferences实例(可空)

final prefs = await SharedPreferences.getInstance();

/// 描述
const key = PrefKeyNullable("some_key", true);

final valueBefore = await key.readSync(prefs); // -> null
await key.writeSync(false, prefs); // -> 值现在为false

更多关于Flutter类型化数据存储插件shared_preferences_typed的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter类型化数据存储插件shared_preferences_typed的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


shared_preferences_typed 是一个基于 shared_preferences 的 Flutter 插件,它提供了类型化的方式来存储和读取数据。相比于 shared_preferencesshared_preferences_typed 提供了更直观的 API,并且减少了类型转换的麻烦。

安装

首先,你需要在 pubspec.yaml 文件中添加 shared_preferences_typed 的依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences_typed: ^1.0.0

然后运行 flutter pub get 来安装依赖。

使用

1. 初始化

你可以通过 SharedPreferencesTyped 类来初始化和使用类型化的 SharedPreferences。

import 'package:shared_preferences_typed/shared_preferences_typed.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 SharedPreferencesTyped
  final prefs = await SharedPreferencesTyped.getInstance();

  runApp(MyApp(prefs: prefs));
}

class MyApp extends StatelessWidget {
  final SharedPreferencesTyped prefs;

  MyApp({required this.prefs});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SharedPreferencesTyped Example'),
        ),
        body: Center(
          child: MyHomePage(prefs: prefs),
        ),
      ),
    );
  }
}

2. 存储数据

shared_preferences_typed 提供了类型化的方法来存储数据。你可以存储 intdoubleboolStringList<String> 等类型的数据。

void saveData(SharedPreferencesTyped prefs) async {
  await prefs.setInt('myInt', 42);
  await prefs.setDouble('myDouble', 3.14);
  await prefs.setBool('myBool', true);
  await prefs.setString('myString', 'Hello, World!');
  await prefs.setStringList('myStringList', ['one', 'two', 'three']);
}

3. 读取数据

你可以使用类型化的方法来读取数据。如果数据不存在,返回的将是 null

void readData(SharedPreferencesTyped prefs) {
  int? myInt = prefs.getInt('myInt');
  double? myDouble = prefs.getDouble('myDouble');
  bool? myBool = prefs.getBool('myBool');
  String? myString = prefs.getString('myString');
  List<String>? myStringList = prefs.getStringList('myStringList');

  print('myInt: $myInt');
  print('myDouble: $myDouble');
  print('myBool: $myBool');
  print('myString: $myString');
  print('myStringList: $myStringList');
}

4. 删除数据

你可以使用 remove 方法来删除指定的键值对。

void removeData(SharedPreferencesTyped prefs) async {
  await prefs.remove('myInt');
}

5. 清除所有数据

你可以使用 clear 方法来清除所有的键值对。

void clearData(SharedPreferencesTyped prefs) async {
  await prefs.clear();
}

完整示例

以下是一个完整的示例,展示了如何使用 shared_preferences_typed 来存储、读取和删除数据。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  final prefs = await SharedPreferencesTyped.getInstance();

  runApp(MyApp(prefs: prefs));
}

class MyApp extends StatelessWidget {
  final SharedPreferencesTyped prefs;

  MyApp({required this.prefs});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SharedPreferencesTyped Example'),
        ),
        body: Center(
          child: MyHomePage(prefs: prefs),
        ),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final SharedPreferencesTyped prefs;

  MyHomePage({required this.prefs});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        ElevatedButton(
          onPressed: () => saveData(prefs),
          child: Text('Save Data'),
        ),
        ElevatedButton(
          onPressed: () => readData(prefs),
          child: Text('Read Data'),
        ),
        ElevatedButton(
          onPressed: () => removeData(prefs),
          child: Text('Remove Data'),
        ),
        ElevatedButton(
          onPressed: () => clearData(prefs),
          child: Text('Clear Data'),
        ),
      ],
    );
  }

  void saveData(SharedPreferencesTyped prefs) async {
    await prefs.setInt('myInt', 42);
    await prefs.setDouble('myDouble', 3.14);
    await prefs.setBool('myBool', true);
    await prefs.setString('myString', 'Hello, World!');
    await prefs.setStringList('myStringList', ['one', 'two', 'three']);
  }

  void readData(SharedPreferencesTyped prefs) {
    int? myInt = prefs.getInt('myInt');
    double? myDouble = prefs.getDouble('myDouble');
    bool? myBool = prefs.getBool('myBool');
    String? myString = prefs.getString('myString');
    List<String>? myStringList = prefs.getStringList('myStringList');

    print('myInt: $myInt');
    print('myDouble: $myDouble');
    print('myBool: $myBool');
    print('myString: $myString');
    print('myStringList: $myStringList');
  }

  void removeData(SharedPreferencesTyped prefs) async {
    await prefs.remove('myInt');
  }

  void clearData(SharedPreferencesTyped prefs) async {
    await prefs.clear();
  }
}
回到顶部