Flutter共享对象管理插件shared_objects的使用
Flutter共享对象管理插件shared_objects的使用
概念
在创建可持久化的值时,通常需要一些样板代码。例如:
import 'package:shared_preferences/shared_preferences.dart';
String? _value;
Future<void> setValue(String newValue) async {
final sharedPrefs = await SharedPreferences.getInstance();
await sharedPrefs.setString('name', newValue);
}
Future<String?> getValue() async {
final sharedPrefs = await SharedPreferences.getInstance();
return sharedPrefs.getString('name');
}
shared_objects
包旨在将这些样板代码简化为更简洁的实现。例如:
import 'package:shared_objects/shared_objects.dart';
final value = SharedString('name');
await value.set('newValue');
await value.get();
开始使用
在项目中添加依赖项,使用以下命令:
flutter pub add shared_objects
使用方法
定义一个可持久化的对象的基本类是显式类型的 SharedObjectBase
类。所有可持久化的对象都包含以下组件:
id
: 与该对象关联的唯一String
键。set(T?)
: 异步设置该对象的新值。如果新值为null
,则删除对象的内容,并从SharedPreferences
映射中移除id
。get()
: 异步获取该对象的当前值。mutate(T? Function(T?))
: 异步通过传递一个函数来修改对象的值。该函数通过get()
获取初始值,并必须返回更新后的值。如果初始值等于更新后的值,则不进行任何更改,跳过对set(T?)
的调用。
该包已经包括了几个方便的基类扩展。这包括以下类:
SharedBool
: 可持久化的bool
。SharedDouble
: 可持久化的double
,具有算术扩展(add
、sub
、mul
、div
、pow
)。SharedInt
: 可持久化的int
,具有算术扩展(add
、sub
、mul
、div
、pow
)。SharedString
: 可持久化的String
,具有append
扩展。SharedStringList
: 可持久化的List<String>
,具有列表扩展(add
、addAll
、remove
)。
完整示例
以下是一个完整的示例,展示了如何使用 shared_objects
插件来注入带有持久化状态的对象。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_objects/shared_objects.dart';
// 使用 shared_objects 注入具有持久化状态的对象。
class SharedObjectProvider {
final count = SharedInt('count');
final toggle = SharedBool('toggle');
Future<void> setDefaults() async {
// 初始化计数器
count.mutate((initial) => initial ?? 0);
// 初始化开关
toggle.mutate((initial) => initial ?? false);
}
}
Future<void> main() async {
final sharedObjectProvider = SharedObjectProvider();
await sharedObjectProvider.setDefaults();
WidgetsFlutterBinding.ensureInitialized();
runApp(Provider.value(
value: sharedObjectProvider,
child: const MyApp(),
));
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'shared_objects',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
late final _count = context.read<SharedObjectProvider>().count;
late final _toggle = context.read<SharedObjectProvider>().toggle;
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('shared_objects'),
),
body: Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
OutlinedButton(
child: const Text('Increment'),
onPressed: () async {
await _count.add(1);
setState(() {});
},
),
FutureBuilder(
future: _count.get(),
initialData: -1,
builder: (context, snapshot) {
final data = snapshot.data as int;
return Text('Current count: $data');
},
),
FutureBuilder(
future: _toggle.get(),
initialData: false,
builder: (context, snapshot) {
final data = snapshot.data as bool;
return Switch(
value: data,
onChanged: (newState) {
_toggle.set(newState);
setState(() {});
},
);
},
)
],
),
),
);
}
}
更多关于Flutter共享对象管理插件shared_objects的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter共享对象管理插件shared_objects的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
shared_objects
是一个用于在 Flutter 应用中管理和共享对象的插件。它允许你在不同的页面或组件之间共享和访问同一个对象实例,而不需要手动传递对象或使用全局变量。这有助于简化代码并提高可维护性。
安装
首先,你需要在 pubspec.yaml
文件中添加 shared_objects
插件的依赖:
dependencies:
flutter:
sdk: flutter
shared_objects: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
使用步骤
-
创建共享对象
你可以创建一个类,并将其注册为共享对象。例如:class MySharedData { String data = 'Initial Data'; }
-
注册共享对象
在应用的入口处(如main.dart
文件中),使用SharedObjects
注册你的共享对象:import 'package:flutter/material.dart'; import 'package:shared_objects/shared_objects.dart'; void main() { // 注册共享对象 SharedObjects().register<MySharedData>(MySharedData()); runApp(MyApp()); }
-
访问共享对象
在应用的任何地方,你都可以通过SharedObjects
访问已注册的共享对象:class MyHomePage extends StatelessWidget { [@override](/user/override) Widget build(BuildContext context) { // 获取共享对象 final mySharedData = SharedObjects().get<MySharedData>(); return Scaffold( appBar: AppBar( title: Text('Shared Objects Example'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ Text('Shared Data: ${mySharedData.data}'), ElevatedButton( onPressed: () { // 修改共享对象中的数据 mySharedData.data = 'Updated Data'; // 触发界面更新 (context as Element).markNeedsBuild(); }, child: Text('Update Data'), ), ], ), ), ); } }
-
更新界面
当你修改共享对象中的数据时,可能需要手动触发界面的更新。你可以使用markNeedsBuild
方法来实现这一点,或者使用StatefulWidget
和setState
来管理状态。
注意事项
- 生命周期管理:
shared_objects
插件不会自动管理对象的生命周期。你需要确保在适当的时机注册和注销共享对象,以避免内存泄漏。 - 线程安全:如果共享对象在多个线程中被访问和修改,请确保它是线程安全的。
示例代码
以下是一个完整的示例,展示了如何使用 shared_objects
插件:
import 'package:flutter/material.dart';
import 'package:shared_objects/shared_objects.dart';
class MySharedData {
String data = 'Initial Data';
}
void main() {
// 注册共享对象
SharedObjects().register<MySharedData>(MySharedData());
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Shared Objects Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
// 获取共享对象
final mySharedData = SharedObjects().get<MySharedData>();
return Scaffold(
appBar: AppBar(
title: Text('Shared Objects Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Shared Data: ${mySharedData.data}'),
ElevatedButton(
onPressed: () {
// 修改共享对象中的数据
mySharedData.data = 'Updated Data';
// 触发界面更新
(context as Element).markNeedsBuild();
},
child: Text('Update Data'),
),
],
),
),
);
}
}