Flutter单项数据存储插件single_item_storage的使用

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

Flutter单项数据存储插件single_item_storage的使用

single_item_storage 是一个用于抽象存储实现的单项目存储插件,提供了创建、读取、更新和删除(CRUD)操作的功能。该插件可以用于测试、快速切换实现等场景。

基础存储类定义

基础存储类 Storage<E> 定义如下:

abstract class Storage<E> {
  Future<E> save(E item);
  Future<E?> get();
  Future<void> delete();
}

提供的实现

核心模块中的实现

  • MemoryStorage:内存中易失性实现。
  • CachedStorage:添加缓存功能的包装实现。适用于耗时或性能密集型操作。
  • ObservedStorage:在数据更改时通知监听者的包装实现。
  • StubStorage:不存储任何项目的常量实现。适用于默认/空值。

附加模块中的实现

  • SharedPrefsStorage:在 single_item_shared_prefs 包中提供 SharedPreferences 实现。
  • SecureStorage:在 single_item_secure_storage 包中提供 FlutterSecureStorage 实现。

示例代码

以下是一个完整的示例 demo,展示了如何使用 single_item_storage 插件进行 CRUD 操作,并混合不同的实现来优化性能。

CRUD 操作示例

import 'package:flutter/material.dart';
import 'package:single_item_shared_prefs/single_item_shared_prefs.dart';
import 'package:single_item_secure_storage/single_item_secure_storage.dart';
import 'package:single_item_storage/cached_storage.dart';
import 'package:single_item_storage/storage.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 使用 Shared Preferences 存储用户数据
  Storage<User> sharedPrefsStorage = SharedPrefsStorage<User>(
    itemKey: 'model.user.key',
    fromMap: (map) => User.fromMap(map),
    toMap: (item) => item.toMap(),
  );

  // 添加/更新项
  await sharedPrefsStorage.save(User.demo());

  // 获取项
  User? user = await sharedPrefsStorage.get();
  print('Retrieved user: $user');

  // 删除项
  await sharedPrefsStorage.delete();
}

class User {
  String name;
  int age;

  User(this.name, this.age);

  factory User.demo() => User('John Doe', 30);

  Map<String, dynamic> toMap() => {'name': name, 'age': age};

  static User fromMap(Map<String, dynamic> map) =>
      User(map['name'] as String, map['age'] as int);

  @override
  String toString() => 'User(name: $name, age: $age)';
}

混合实现示例

以下示例展示了如何结合多种实现来提高性能:

// 使用 SharedPreferences 存储数据
// 使用内存缓存以减少文件系统访问次数
// 提供数据更改更新给 ObservedStorage 订阅者

Storage<Item> observedCachedStorage = ObservedStorage(
  CachedStorage(
    SharedPrefsStorage<Item>(
      itemKey: 'model.item.key',
      fromMap: (map) => Item.fromMap(map),
      toMap: (item) => item.toMap(),
    ),
  ),
);

// 添加/更新项
await observedCachedStorage.save(Item.demo());

// 获取项
Item? item = await observedCachedStorage.get();
print('Retrieved item: $item');

// 删除项
await observedCachedStorage.delete();

通过上述示例,您可以了解到如何使用 single_item_storage 插件进行数据存储和管理。根据您的需求,可以选择合适的实现方式来优化应用性能和用户体验。


这个 Markdown 文档提供了 `single_item_storage` 插件的基本介绍、提供的实现以及如何在 Flutter 应用中使用的完整示例。希望对您有所帮助!

更多关于Flutter单项数据存储插件single_item_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter单项数据存储插件single_item_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter单项数据存储插件single_item_storage的代码案例。这个插件允许你轻松地存储和检索单个键值对数据。

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

dependencies:
  flutter:
    sdk: flutter
  single_item_storage: ^最新版本号  # 请替换为当前最新版本号

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

接下来,让我们编写一些代码来演示如何使用这个插件。

示例代码

1. 导入依赖

在你的Dart文件中导入single_item_storage

import 'package:single_item_storage/single_item_storage.dart';

2. 初始化SingleItemStorage

你可以使用SingleItemStorage类来存储和检索数据。通常,你会在应用的某个全局位置(比如main.dart或者一个单独的服务类中)初始化这个类。

class StorageService {
  static final StorageService _instance = StorageService._internal();
  SingleItemStorage<String>? _storage;

  factory StorageService() => _instance;

  StorageService._internal() {
    _storage = SingleItemStorage<String>(
      key: 'my_single_item_key',
      storage: FlutterSecureStorage(), // 或者使用其他存储后端,如SharedPreferences
    );
  }

  Future<void> saveItem(String value) async {
    await _storage!.write(value);
  }

  Future<String?> readItem() async {
    return await _storage!.read();
  }

  Future<void> deleteItem() async {
    await _storage!.delete();
  }
}

3. 使用StorageService

现在你可以在你的应用中使用StorageService来存储和检索数据。例如,在一个简单的Flutter应用中:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'storage_service.dart'; // 假设你将上面的代码保存在这个文件中

void main() {
  runApp(
    MultiProvider(
      providers: [
        Provider<StorageService>(
          create: (_) => StorageService(),
        ),
      ],
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Single Item Storage Example'),
        ),
        body: Center(
          child: StorageExample(),
        ),
      ),
    );
  }
}

class StorageExample extends StatefulWidget {
  @override
  _StorageExampleState createState() => _StorageExampleState();
}

class _StorageExampleState extends State<StorageExample> {
  final TextEditingController _controller = TextEditingController();
  String? _readValue;

  @override
  Widget build(BuildContext context) {
    final storageService = Provider.of<StorageService>(context);

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        TextField(
          controller: _controller,
          decoration: InputDecoration(labelText: 'Enter value to save'),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            await storageService.saveItem(_controller.text);
            setState(() {
              _readValue = null; // 清除读取值以显示更新后的数据
            });
          },
          child: Text('Save'),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            _readValue = await storageService.readItem();
            setState(() {});
          },
          child: Text('Read'),
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: () async {
            await storageService.deleteItem();
            setState(() {
              _readValue = null;
            });
          },
          child: Text('Delete'),
        ),
        SizedBox(height: 20),
        Text(_readValue ?? 'No value read yet'),
      ],
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

这个示例展示了如何使用single_item_storage插件来存储、读取和删除一个单项数据。你可以根据自己的需求扩展这个示例。

回到顶部