Flutter数据持久化插件flutter_persistence的使用

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

Flutter数据持久化插件flutter_persistence的使用

Flutter Persistence

Flutter Persistence 是一个用于在 Flutter 应用程序中使用 Hive 作为本地存储解决方案来持久化和检索数据的库。它提供了一种方便的方式来存储和访问数据,包括流式和基于未来操作。

初始化

在使用 Flutter Persistence 之前,需要通过 init 方法初始化它。这会初始化 Hive 并打开一个用于数据存储的存储箱。

await FlutterPersistence.init()

支持的数据类型

Flutter Persistence 支持以下数据类型:

  • Map<String, dynamic>
  • Map<dynamic, dynamic>
  • List<Map<String, dynamic>>
  • List<dynamic>
  • List<int>
  • List<double>
  • List<String>
  • int
  • double
  • String

注意: 当使用动态数据时,必须是上述允许类型之一。

使用示例

流式数据

你可以使用 Flutter Persistence 来流式处理数据并持久化。例如:

final persistedStream = FlutterPersistence.stream(key: "myStreamKey", stream: myStream);

注意: 对于 Supabase 推荐设置 waitForConnection = true

基于未来的操作

你也可以处理基于未来的操作。例如:

final cachedFuture = FlutterPersistence.future(key: "myFutureKey", stream: myFuture);

异常处理

Flutter Persistence 提供了几个异常类来处理错误:

  • NotAllowedTypeException: 当遇到无效的数据类型时抛出。
  • NotAllowedDynamicTypeException: 当遇到无效的动态数据类型时抛出。
  • NotInitializedException: 当执行操作而未初始化 Flutter Persistence 时抛出。
  • NotExistingKey: 当查找的键不存在于缓存中时抛出。

贡献

欢迎对 Flutter Persistence 进行贡献!请随时提交问题、拉取请求或建议以帮助改进此库。

许可证

此库遵循 MIT 许可证。

MIT License

Copyright © 2023 Gabriele Marra

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


---

#### 示例代码

```dart
import 'package:flutter/material.dart';
import 'package:flutter_persistence/flutter_persistence.dart';

void main() async {
  // 初始化 Flutter Persistence 在运行应用程序之前。
  await FlutterPersistence.init();
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

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

  // 生成一个假的异步流生成器用于演示目的。
  Stream<int> buildFakeStream() async* {
    await Future.delayed(const Duration(seconds: 3));
    for (int i = 0; i < 10; i++) {
      await Future.delayed(const Duration(seconds: 1));
      yield i;
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 生成假的流并使用 Flutter Persistence 持久化。
    final myStream = buildFakeStream();
    final persistedStream =
        FlutterPersistence.stream(key: "fakeStream", stream: myStream);

    return Scaffold(
      appBar: AppBar(
        title: const Text("Flutter Persistence"),
      ),
      body: StreamBuilder(
        stream: persistedStream,
        builder: (context, snap) {
          if (snap.hasData) {
            // 显示从持久化流中获取的数据。
            return Text(snap.data.toString());
          } else if (snap.hasError {
            // 处理并显示任何在流处理过程中发生的错误。
            return Text(snap.error.toString());
          }
          // 显示等待数据的空容器。
          return Container();
        },
      ),
    );
  }
}

更多关于Flutter数据持久化插件flutter_persistence的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据持久化插件flutter_persistence的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 flutter_persistence 插件进行数据持久化的代码示例。flutter_persistence 是一个用于 Flutter 的数据持久化库,它提供了简单的 API 来保存和加载数据。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_persistence: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来是一个简单的示例,展示如何使用 flutter_persistence 来保存和加载数据。

示例代码

  1. 初始化 Flutter Persistence

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

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

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  FlutterPersistence.initialize(storage: StorageType.SQLITE); // 或者使用 StorageType.SHARED_PREFERENCES

  runApp(MyApp());
}
  1. 创建数据模型

创建一个简单的数据模型类,例如 User

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  final String name;
  final int age;

  User({required this.name, required this.age});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

运行 flutter pub run build_runner build 来生成 user.g.dart 文件。

  1. 保存和加载数据

在你的应用中使用 FlutterPersistence 来保存和加载 User 对象:

import 'package:flutter/material.dart';
import 'package:flutter_persistence/flutter_persistence.dart';
import 'user.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  FlutterPersistence.initialize(storage: StorageType.SQLITE);

  runApp(MyApp());
}

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

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

class _MyHomePageState extends State<MyHomePage> {
  late User user;

  @override
  void initState() {
    super.initState();
    // 尝试从持久化存储中加载用户数据
    loadUser().then((loadedUser) {
      if (loadedUser != null) {
        setState(() {
          user = loadedUser;
        });
      } else {
        // 如果没有加载到数据,则创建一个新用户
        user = User(name: 'John Doe', age: 30);
        saveUser(user);
      }
    });
  }

  Future<void> saveUser(User user) async {
    await FlutterPersistence.save('user', user.toJson());
  }

  Future<User?> loadUser() async {
    Map<String, dynamic>? userJson = await FlutterPersistence.load('user');
    if (userJson != null) {
      return User.fromJson(userJson);
    }
    return null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Persistence Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('User Name: ${user.name}'),
            Text('User Age: ${user.age}'),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 更新用户数据并保存
          setState(() {
            user = User(name: '${user.name} Updated', age: user.age + 1);
          });
          saveUser(user);
        },
        tooltip: 'Update User',
        child: Icon(Icons.edit),
      ),
    );
  }
}

在这个示例中,我们:

  1. 初始化了 FlutterPersistence
  2. 创建了一个 User 数据模型。
  3. MyHomePage 中,尝试从持久化存储中加载用户数据。如果数据不存在,则创建一个新用户并保存。
  4. 提供了一个浮动操作按钮(FAB),用于更新用户数据并保存更改。

这样,你就可以使用 flutter_persistence 插件在 Flutter 应用中实现数据持久化了。

回到顶部