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,具有算术扩展(addsubmuldivpow)。
  • SharedInt: 可持久化的 int,具有算术扩展(addsubmuldivpow)。
  • SharedString: 可持久化的 String,具有 append 扩展。
  • SharedStringList: 可持久化的 List<String>,具有列表扩展(addaddAllremove)。

完整示例

以下是一个完整的示例,展示了如何使用 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

1 回复

更多关于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 来安装依赖。

使用步骤

  1. 创建共享对象
    你可以创建一个类,并将其注册为共享对象。例如:

    class MySharedData {
      String data = 'Initial Data';
    }
    
  2. 注册共享对象
    在应用的入口处(如 main.dart 文件中),使用 SharedObjects 注册你的共享对象:

    import 'package:flutter/material.dart';
    import 'package:shared_objects/shared_objects.dart';
    
    void main() {
      // 注册共享对象
      SharedObjects().register<MySharedData>(MySharedData());
    
      runApp(MyApp());
    }
    
  3. 访问共享对象
    在应用的任何地方,你都可以通过 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'),
                ),
              ],
            ),
          ),
        );
      }
    }
    
  4. 更新界面
    当你修改共享对象中的数据时,可能需要手动触发界面的更新。你可以使用 markNeedsBuild 方法来实现这一点,或者使用 StatefulWidgetsetState 来管理状态。

注意事项

  • 生命周期管理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'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部