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

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

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

pref_dessert 是一个用于简化对象持久化到共享偏好设置(SharedPreferences)的Flutter插件。通过扩展 DesSer<T> 类并实现序列化和反序列化方法,可以轻松地将自定义对象保存和读取。

快速入门

  1. 扩展 DesSer<T>:替换泛型 T 为你想要保存的对象类型。
  2. 实现两个方法serializedeserialize 方法分别用于对象的序列化和反序列化。
  3. 传递给 PreferenceRepositoryFuturePreferencesRepository:创建一个实例并传入你实现的类。

示例

定义一个 Person

class Person {
  String name;
  int age;

  Person(this.name, this.age);
}

实现 PersonDesSer

class PersonDesSer extends DesSer<Person> {
  @override
  Person deserialize(String s) {
    var split = s.split(",");
    return new Person(split[0], int.parse(split[1]));
  }

  @override
  String serialize(Person t) {
    return "${t.name},${t.age}";
  }
  
  @override
  String get key => "Person";
}

使用 FuturePreferencesRepository

import 'package:pref_dessert/pref_dessert.dart';

void main() {
  var repo = new FuturePreferencesRepository<Person>(new PersonDesSer());
  repo.save(new Person("Foo", 42));
  repo.save(new Person("Bar", 1));
  var list = repo.findAll();
  print(list); // 输出所有保存的 Person 对象
}

使用 JSON 序列化

你可以使用 Dart 的 convert 包来处理 JSON 序列化:

import 'dart:convert';

class JsonPersonDesSer extends DesSer<Person> {
  @override
  Person deserialize(String s) {
    var map = json.decode(s);
    return new Person(map['name'] as String, map['age'] as int);
  }

  @override
  String serialize(Person t) {
    var map = {"name": t.name, "age": t.age};
    return json.encode(map);
  }
}

使用 json_serializable 自动生成序列化代码

为了进一步简化开发流程,你可以使用 json_serializable 包来自动生成序列化代码。

步骤 1:在 pubspec.yaml 中添加依赖

dependencies:
  flutter:
    sdk: flutter
  pref_dessert: ^0.4.0+1
  json_serializable: ^3.2.2
  json_annotation: ^3.0.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^1.0.0

步骤 2:创建带有注解的类

import 'package:pref_dessert/pref_dessert.dart';
import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  String uid = "";
  String photoUrl = "";
  String displayName = "";
  String email = "";

  User({this.uid, this.photoUrl, this.displayName, this.email});
}

class UserDesSer extends JsonDesSer<User> {
  @override
  String get key => "PREF_USER";

  @override
  User fromMap(Map<String, dynamic> map) => _$UserFromJson(map);

  @override
  Map<String, dynamic> toMap(User user) => _$UserToJson(user);
}

步骤 3:运行命令生成代码

flutter pub run build_runner build

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

1 回复

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


当然,以下是如何在Flutter项目中使用pref_dessert插件来管理偏好设置的代码示例。pref_dessert是一个用于简化Flutter中的偏好设置管理的插件。

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

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

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

接下来是一个完整的示例,展示如何使用pref_dessert来存储和读取偏好设置。

主程序文件(main.dart

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

void main() {
  // 初始化PrefDessert
  PrefDessert.init(context);

  runApp(MyApp());
}

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

class PreferencesScreen extends StatefulWidget {
  @override
  _PreferencesScreenState createState() => _PreferencesScreenState();
}

class _PreferencesScreenState extends State<PreferencesScreen> {
  final String keyThemeMode = 'theme_mode';

  @override
  Widget build(BuildContext context) {
    ThemeMode currentThemeMode = PrefDessert.get<ThemeMode>(keyThemeMode, defaultValue: ThemeMode.system);

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Current Theme Mode: ${currentThemeMode.toString()}'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () {
            setThemeMode(ThemeMode.light);
          },
          child: Text('Set to Light Mode'),
        ),
        SizedBox(height: 10),
        ElevatedButton(
          onPressed: () {
            setThemeMode(ThemeMode.dark);
          },
          child: Text('Set to Dark Mode'),
        ),
        SizedBox(height: 10),
        ElevatedButton(
          onPressed: () {
            setThemeMode(ThemeMode.system);
          },
          child: Text('Set to System Mode'),
        ),
      ],
    );
  }

  void setThemeMode(ThemeMode themeMode) {
    PrefDessert.save<ThemeMode>(keyThemeMode, themeMode);
    // 根据需要刷新UI或执行其他操作
    setState(() {});
  }
}

说明

  1. 初始化PrefDessert:在main函数中,通过调用PrefDessert.init(context)来初始化插件。

  2. 读取偏好设置:使用PrefDessert.get<T>(key, defaultValue: T)方法来读取偏好设置。在这个例子中,我们读取了一个名为theme_mode的设置,它表示主题模式,并指定了一个默认值ThemeMode.system

  3. 保存偏好设置:使用PrefDessert.save<T>(key, value)方法来保存偏好设置。在这个例子中,我们保存了用户选择的主题模式。

  4. UI更新:当用户点击按钮更改主题模式时,我们调用setState(() {})来刷新UI,以反映新的主题模式。

这个示例展示了如何使用pref_dessert来管理简单的偏好设置。根据你的具体需求,你可以扩展这个示例来管理更多的偏好设置。

回到顶部