Flutter设置管理插件settings_builder的使用
Flutter设置管理插件settings_builder的使用
settings_builder
settings_builder 是一个 Dart 构建器,用于生成自动访问器来读取和写入 SharedPreferences。
目录
特性
- 生成编译时安全访问
SharedPreferences
。 - 假设一个本地 API,例如 shared_preferences。
- 不依赖于该包,这意味着您可以根据需要实现自己的版本。
- 可以在非 Flutter 项目中使用。
- 内置支持所有与
SharedPreferences
兼容的类型。- 允许定义默认值。
- 支持任何类型通过自定义转换器。
- 分层结构化。
安装
由于这是一个构建器包,您还需要安装注解和 build_runner:
dependencies:
settings_annotation: <latest>
dev_dependencies:
build_runner: <latest>
settings_builder: <latest>
使用
以下是一个非常基础的例子来入门。对于更完整的例子,请查看示例页面。
生成设置不需要太多设置。以下是运行的基本示例。它提供了一个简单的设置实例,其中包含两个条目:一个存储为整数的 logLevel
和一个 account
。账户本身是一个子组,包含一个默认为 false
的 loggedIn
布尔值和一个 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
更多关于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(); // 保存更改
});
},
),
// 可以添加更多的设置项
],
),
),
);
}
}
说明
- 初始化设置:在
main
函数中,我们调用MySettings.init()
来初始化设置。 - 主题模式:根据
MySettings.instance.themeMode
的值来设置应用的亮度。 - 设置页面:在
SettingsPage
中,我们使用SwitchListTile
和SliderListTile
来显示和修改设置项。当设置项的值更改时,我们调用MySettings.instance.save()
来保存更改。
这样,你就可以在你的Flutter应用中使用settings_builder
插件来管理设置了。