Flutter设置管理插件settings_builder的使用

Flutter设置管理插件settings_builder的使用

settings_builder

CI/CD for settings_builder Pub Version

settings_builder 是一个 Dart 构建器,用于生成自动访问器来读取和写入 SharedPreferences。

目录

目录由 markdown-toc 生成

特性

  • 生成编译时安全访问 SharedPreferences
  • 假设一个本地 API,例如 shared_preferences
    • 不依赖于该包,这意味着您可以根据需要实现自己的版本。
    • 可以在非 Flutter 项目中使用。
  • 内置支持所有与 SharedPreferences 兼容的类型。
    • 允许定义默认值。
    • 支持任何类型通过自定义转换器。
  • 分层结构化。

安装

由于这是一个构建器包,您还需要安装注解和 build_runner:

dependencies:
  settings_annotation: <latest>

dev_dependencies:
  build_runner: <latest>
  settings_builder: <latest>

使用

以下是一个非常基础的例子来入门。对于更完整的例子,请查看示例页面。

生成设置不需要太多设置。以下是运行的基本示例。它提供了一个简单的设置实例,其中包含两个条目:一个存储为整数的 logLevel 和一个 account。账户本身是一个子组,包含一个默认为 falseloggedIn 布尔值和一个 name

part 'settings.g.dart'; // 假设此文件名为 'settings.dart'

[@SettingsGroup](/user/SettingsGroup)()
abstract class AccountSettings with _$AccountSettings {
  [@SettingsEntry](/user/SettingsEntry)(defaultValue: false)
  bool get loggedIn;

  String? get name;
}

[@SettingsGroup](/user/SettingsGroup)(root: true)
abstract class Settings with _$Settings {
  factory Settings(SharedPreferences sharedPreferences, [String? prefix]) =
      _$SettingsImpl;

  static Future<Settings> getInstance([String? prefix]) =>
      _$SettingsImpl.getInstance();

  AccountSettings get account;

  int? get logLevel;
}

现在运行 dart run build_runner build,代码将被生成。

要使用这些生成的设置,您可以简单地通过 getInstance 创建一个新实例,并使用生成的成员:

final settings = await Settings.getInstance();

// 存储设置的键是自动生成的:
print(settings.account.loggedInKey); // 打印 'account.loggedIn'
print(settings.logLevelKey); // 打印 'logLevel'

// 初始时,值未设置:
print(settings.account.hasLoggedIn); // 打印 false
print(settings.account.loggedIn); // 打印 false
print(settings.hasLogLevel); // 打印 false
print(settings.logLevel); // 打印 null

// 您可以更新它们:
await settings.setLogLevel(10);
print(settings.hasLogLevel); // 打印 true
print(settings.logLevel); // 打印 10

// 并且可以再次删除它们
await settings.removeLogLevel();
print(settings.hasLogLevel); // 打印 false
print(settings.logLevel); // 打印 null

文档

文档可以在 pub.dev 上找到:


示例代码

// 忽略: 更倾向于构造函数而不是静态方法,避免打印

import 'package:settings_annotation/settings_annotation.dart';

import 'shared_preferences.dart';

part 'main.g.dart';

class Color {
  final int argb;

  const Color(this.argb);

  static Color fromValue(int v) => Color(v);
  static int toValue(Color c) => c.argb;
}

enum LogLevel {
  debug,
  info,
  warn,
  error,
}

[@SettingsGroup](/user/SettingsGroup)()
abstract class AccountSettings with _$AccountSettings {
  // 存储为自定义键,默认值为 false
  [@SettingsEntry](/user/SettingsEntry)(
    key: 'logged-in',
    defaultValue: false,
  )
  bool get loggedIn;

  // 如果尚未设置,则返回 null
  bool? get consent;

  // 如果尚未设置,则返回 null
  String? get name;
}

[@SettingsGroup](/user/SettingsGroup)(root: true)
abstract class Settings with _$Settings {
  factory Settings(SharedPreferences sharedPreferences, [String? prefix]) =
      _$SettingsImpl;

  static Future<Settings> getInstance([String? prefix]) =>
      _$SettingsImpl.getInstance();

  AccountSettings get account;

  [@SettingsEntry](/user/SettingsEntry)(
    fromSettings: Color.fromValue,
    toSettings: Color.toValue,
  )
  Color? get color;

  [@SettingsEntry](/user/SettingsEntry)(
    key: 'log-level',
    defaultValue: LogLevel.warn,
  )
  LogLevel get logLevel;

  [@SettingsEntry](/user/SettingsEntry)(
    fromSettings: _uriFromSettings,
    toSettings: _uriToSettings,
    defaultValue: LiteralDefault("Uri.http('localhost', '/')"),
  )
  Uri get api;

  static Uri _uriFromSettings(String value) => Uri.parse(value);
  static String _uriToSettings(Uri uri) => uri.toString();
}

Future<void> main() async {
  // 创建带有 'app' 前缀的设置实例
  final settings = await Settings.getInstance('app');

  // 默认值
  print('${settings.account.loggedInKey}: ${settings.account.loggedIn}');
  print('${settings.account.consentKey}: ${settings.account.consent}');
  print('${settings.account.nameKey}: ${settings.account.name}');
  print('${settings.colorKey}: ${settings.color}');
  print('${settings.logLevelKey}: ${settings.logLevel}');
  print('${settings.apiKey}: ${settings.api}');

  // 检查同意,然后更新
  if (!settings.account.hasConsent) {
    print('请求同意...');
    await Future<void>.delayed(const Duration(seconds: 1));
    print('已授予!');
    await settings.account.setConsent(true);
    print('${settings.account.consentKey}: ${settings.account.consent}');
  }

  // 更新 API URL
  await settings.setApi(Uri.https('example.com', '/api'));
  print('${settings.apiKey}: ${settings.api}');

  // 再次移除 API URL
  await settings.removeApi();
  print('${settings.apiKey}: ${settings.api}');
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用settings_builder插件来管理设置的代码示例。这个插件允许你轻松地创建和管理应用的设置页面。

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

dependencies:
  flutter:
    sdk: flutter
  settings_builder: ^最新版本号  # 请替换为实际的最新版本号

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

配置Settings文件

创建一个settings.json文件,用于定义你的设置项。例如:

{
  "theme_mode": "system",  // 可选值: "light", "dark", "system"
  "show_notifications": true,
  "font_size": 16
}

创建Settings Model

创建一个Dart文件,比如settings_model.dart,用于定义你的设置模型:

import 'package:settings_builder/settings_builder.dart';

part 'settings.g.dart';

@SettingsBuilder('settings.json')
class MySettings extends Settings {
  String themeMode = 'system';
  bool showNotifications = true;
  int fontSize = 16;

  // 可以添加更多的设置项和验证逻辑
}

运行以下命令来生成settings.g.dart文件:

flutter pub run build_runner build

在应用中加载和使用设置

在你的主应用文件中(例如main.dart),你可以这样加载和使用设置:

import 'package:flutter/material.dart';
import 'package:settings_builder/settings_builder.dart';
import 'settings_model.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await MySettings.init();  // 初始化设置
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        brightness: MySettings.instance.themeMode == 'light'
            ? Brightness.light
            : MySettings.instance.themeMode == 'dark'
                ? Brightness.dark
                : MediaQuery.of(context).platformBrightness,
      ),
      home: SettingsPage(),
    );
  }
}

class SettingsPage extends StatefulWidget {
  @override
  _SettingsPageState createState() => _SettingsPageState();
}

class _SettingsPageState extends State<SettingsPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Settings'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            SwitchListTile(
              title: Text('Show Notifications'),
              value: MySettings.instance.showNotifications,
              onChanged: (newValue) {
                setState(() {
                  MySettings.instance.showNotifications = newValue;
                  MySettings.instance.save();  // 保存更改
                });
              },
            ),
            SliderListTile(
              title: Text('Font Size'),
              value: MySettings.instance.fontSize.toDouble(),
              min: 12.0,
              max: 24.0,
              divisions: 12,
              onChanged: (newValue) {
                setState(() {
                  MySettings.instance.fontSize = newValue.toInt();
                  MySettings.instance.save();  // 保存更改
                });
              },
            ),
            // 可以添加更多的设置项
          ],
        ),
      ),
    );
  }
}

说明

  1. 初始化设置:在main函数中,我们调用MySettings.init()来初始化设置。
  2. 主题模式:根据MySettings.instance.themeMode的值来设置应用的亮度。
  3. 设置页面:在SettingsPage中,我们使用SwitchListTileSliderListTile来显示和修改设置项。当设置项的值更改时,我们调用MySettings.instance.save()来保存更改。

这样,你就可以在你的Flutter应用中使用settings_builder插件来管理设置了。

回到顶部