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

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

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

Masamune logo

Katana Prefs

Follow on Twitter Follow on Threads Maintained with Melos

GitHub Sponsor


[GitHub] | [YouTube] | [Packages] | [Twitter] | [Threads] | [LinkedIn] | [mathru.net]


简介

Shared Preferences 是一个非常有用的插件。

我认为这个插件是存储应用程序简单数据的最佳方式。

然而,在使用系统时,我有以下抱怨:

  • 需要记住键,因为键将是字符串类型。
  • 要检索的值的类型也取决于键,并且必须记住。
  • SharedPreferences 的实例需要异步获取。

在大多数情况下,我认为它们被封装在一个单独的类中或类似的东西中,以便更易于使用。

为了消除上述问题,我创建了以下包:

  • 使用类似于 Freezed 的标记自动生成读取/写入 SharedPreferences 数据的类
  • 参数类型和键是预定义的,允许类型安全的实现
  • 缓存 SharedPreferences 实例,以便可以同步获取数据
  • 继承自 ChangeNotifier,因此可以检测值的变化并执行某些操作

例如,使用以下语句:

[@prefs](/user/prefs)
class PrefsValue with _$PrefsValue, ChangeNotifier {
  factory PrefsValue({
    String? userToken,
    required double volumeSetting,
  }) = _PrefsValue;
}

当运行 build_runner 时,将自动生成一个可以读取和写入 SharedPreferences 数据的类。

通过定义这一点,可以在任何地方读取和写入数据。

final appPrefs = PrefsValue(volumeSetting: 0.5);

class PrefsPage extends StatefulWidget {
  const PrefsPage({super.key});

  [@override](/user/override)
  State<StatefulWidget> createState() => PrefsPageState();
}

class PrefsPageState extends State<PrefsPage> {

  [@override](/user/override)
  void initState() {
    super.initState();
    prefs.addListener(() {
      setState(() {});
    });
    appPrefs.load();
  }

  [@override](/user/override)
  Widget build(BuildContext context, WidgetRef ref){
    final volumeSetting = appPrefs.volumeSetting.get();

    ~~~~
    appPrefs.volumeSetting.set(1.0); // 在此,appPrefs 也会收到更改通知并重新更新小部件。
    ~~~~
  }
}

安装

导入以下包以使用 build_runner 进行代码生成。

flutter pub add katana_prefs
flutter pub add --dev build_runner
flutter pub add --dev katana_prefs_builder

实现

创建类

创建一个类如下:

添加 part '(filename).prefs.dart';

使用 [@prefs](/user/prefs) 注解定义的类,并混入 _$(定义的类名)ChangeNotifier

构造函数在 factory 中创建,并定义参数中要使用的值。

(必需的值用 required 标记;如果没有标记为必需,则保留原样。)

在构造函数之后,写入 = _(定义的类名)

// prefs_value.dart

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

part 'prefs_value.prefs.dart';

[@prefs](/user/prefs)
class PrefsValue with _$PrefsValue, ChangeNotifier {
  factory PrefsValue({
    String? userToken,
    required double volumeSetting,
  }) = _PrefsValue;
}

代码生成

通过输入以下命令进行自动代码生成。

flutter pub run build_runner build --delete-conflicting-outputs

如何使用

全局定义值。

创建对象时,输入在 <code>required</code> 中指定的值。这将成为初始值。

final appPrefs = PrefsValue(volumeSetting: 0.5);

在加载第一个值之前,调用 <code>load()</code> 方法并等待其完成。

(也可以通过监视 <code>loading</code> 字段来等待结束。)

@Override
void initState() {
  super.initState();
  appPrefs.load();
}

如果需要,可以通过 <code>addListener</code> 监视状态。

@Override
void initState() {
  super.initState();
  prefs.addListener(() {
    setState(() {});
  });
  appPrefs.load();
}

可以通过 <code>appPrefs.(定义的值).get()</code> 从 SharedPreferences 中检索数据。

final volumeSetting = appPrefs.volumeSetting.get();

可以通过 <code>appPrefs.(定义的值).set(value)</code> 将数据存储到 SharedPreferences。

保存完成后,将调用 <code>notifyListeners()</code> 以执行由 <code>addListener</code> 监视的回调。

appPrefs.volumeSetting.set(1.0);

GitHub 赞助者

赞助者永远受欢迎。感谢您的支持!

https://github.com/sponsors/mathrunet


示例代码

// Flutter imports:
import 'package:flutter/material.dart';

// Package imports:
import 'package:katana_prefs/katana_prefs.dart';

part 'main.prefs.dart';

[@prefs](/user/prefs)
class PrefsValue with _$PrefsValue, ChangeNotifier {
  factory PrefsValue({
    String? userToken,
    required double volumeSetting,
  }) = _PrefsValue;
  PrefsValue._();
}

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const PrefsPage(),
      title: "Flutter Demo",
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
    );
  }
}

class PrefsPage extends StatefulWidget {
  const PrefsPage({super.key});

  [@override](/user/override)
  State<StatefulWidget> createState() => PrefsPageState();
}

class PrefsPageState extends State<PrefsPage> {
  final prefs = PrefsValue(volumeSetting: 0.5);

  [@override](/user/override)
  void initState() {
    super.initState();
    prefs.addListener(() {
      setState(() {});
    });
    prefs.load();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Flutter Demo")),
      body: ListView(
        children: [
          ListTile(
            title: TextField(
              controller: TextEditingController(text: prefs.userToken.get()),
              onChanged: (val) async {
                await prefs.userToken.set(val);
              },
            ),
          ),
          const Padding(
            padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
            child: Text("Volume Settings"),
          ),
          ListTile(
            title: Slider(
              value: prefs.volumeSetting.get(),
              onChanged: (val) {
                prefs.volumeSetting.set(val);
              },
            ),
            trailing: Text(
              "${prefs.volumeSetting.get().toStringAsFixed(1)}/1.0",
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用katana_prefs插件进行偏好设置管理的代码示例。katana_prefs是一个用于简化偏好设置(如用户设置、应用状态等)管理的Flutter插件。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  katana_prefs: ^最新版本号  # 请替换为最新版本号

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

2. 初始化KatanaPrefs

在你的主文件(通常是main.dart)中,你需要初始化KatanaPrefs

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化KatanaPrefs
    KatanaPrefs.init(context);
    
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 使用KatanaPrefs进行偏好设置管理

接下来,你可以在你的页面或组件中使用KatanaPrefs来保存和读取偏好设置。以下是一个简单的示例,展示如何保存和读取一个布尔值偏好设置:

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

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

class _MyHomePageState extends State<MyHomePage> {
  bool _isDarkMode = false;

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

    // 从偏好设置中读取isDarkMode的值
    KatanaPrefs.getBool('isDarkMode').then((value) {
      if (value != null) {
        setState(() {
          _isDarkMode = value;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('KatanaPrefs Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Dark Mode: $_isDarkMode',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                setState(() {
                  _isDarkMode = !_isDarkMode;

                  // 保存isDarkMode的值到偏好设置
                  KatanaPrefs.setBool('isDarkMode', _isDarkMode);
                });
              },
              child: Text('Toggle Dark Mode'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

现在,你可以运行你的Flutter应用,并看到一个可以切换“Dark Mode”的按钮。当你切换开关并重新启动应用时,你会看到之前保存的设置值。

这个示例展示了如何使用katana_prefs插件来管理简单的布尔值偏好设置。同样的方法也可以用于保存和读取其他类型的数据,如字符串、整数、浮点数、列表和映射。只需使用KatanaPrefs提供的相应方法(如getStringsetIntsetDoublesetListsetMap等)即可。

回到顶部