Flutter本地存储插件stored的使用

Flutter本地存储插件stored的使用

stored 是一个用于从远程和本地源加载数据的Dart库。

问题:

  • 现代软件需要数据表示形式灵活且始终可用。
  • 用户期望他们的UI体验不会因新数据加载而受到影响(阻塞)。无论是社交、新闻还是企业对企业的应用,用户都希望在线和离线时都能获得无缝体验。
  • 国际用户期望最小的数据下载量,因为大量下载的数据可能会导致巨额电话账单。

Store 是一个简化应用程序中数据获取、共享、存储和检索的类。Store 类似于仓储模式,并提供了一个基于dart:async构建的API,遵循单向数据流。

Store 在UI元素和数据操作之间提供了抽象层。

概述

Store 负责管理特定的数据请求。当你创建一个Store的实现时,你需要提供一个Fetcher,一个定义如何通过网络获取数据的函数。你还可以定义你的Store如何在内存和磁盘上缓存数据。由于Store返回的数据是一个Flow,线程处理变得非常简单!一旦构建好Store,它将处理围绕数据流的逻辑,允许你的视图使用最佳数据源,并确保最新的数据总是可用于离线使用。

Store 利用多重请求节流来防止对网络和磁盘缓存进行过多调用。通过使用Store,你可以消除向网络发送相同请求的可能性,同时添加两层缓存(内存和磁盘),并且能够将磁盘作为事实来源,在不经过Store的情况下直接修改磁盘(与可以提供可观察源的数据库如hivesqfliteRealm一起使用效果最佳)。

示例代码

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Stored Demo')),
        body: Center(child: MyStoreWidget()),
      ),
    );
  }
}

class MyStoreWidget extends StatefulWidget {
  [@override](/user/override)
  _MyStoreWidgetState createState() => _MyStoreWidgetState();
}

class _MyStoreWidgetState extends State<MyStoreWidget> {
  // 初始化Store实例
  final store = Store<int>(
    fetcher: () async {
      // 模拟网络请求
      await Future.delayed(Duration(seconds: 2));
      return 42;
    },
    inMemoryCache: true,
    onDiskCache: true,
  );

  [@override](/user/override)
  void initState() {
    super.initState();
    // 订阅Store的数据变化
    store.flow.listen((data) {
      print('Received data: $data');
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () {
            // 触发数据获取
            store.fetch();
          },
          child: Text('Fetch Data'),
        ),
        SizedBox(height: 20),
        Text('Data: ${store.data}'),
      ],
    );
  }
}

代码解释

  1. 导入库:

    import 'package:flutter/material.dart';
    import 'package:stored/stored.dart';
    
  2. 初始化应用:

    void main() {
      runApp(MyApp());
    }
    
  3. 创建应用界面:

    class MyApp extends StatelessWidget {
      [@override](/user/override)
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text('Stored Demo')),
            body: Center(child: MyStoreWidget()),
          ),
        );
      }
    }
    
  4. 创建Store实例:

    class _MyStoreWidgetState extends State<MyStoreWidget> {
      final store = Store<int>(
        fetcher: () async {
          await Future.delayed(Duration(seconds: 2));
          return 42;
        },
        inMemoryCache: true,
        onDiskCache: true,
      );
    
  5. 订阅Store的数据变化:

    [@override](/user/override)
    void initState() {
      super.initState();
      store.flow.listen((data) {
        print('Received data: $data');
      });
    }
    
  6. 触发数据获取:

    ElevatedButton(
      onPressed: () {
        store.fetch();
      },
      child: Text('Fetch Data'),
    )
    
  7. 展示数据:

    Text('Data: ${store.data}')
    

更多关于Flutter本地存储插件stored的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


stored 是一个用于 Flutter 的本地存储插件,它提供了一种简单的方式来存储和检索数据。以下是如何使用 stored 插件的基本步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 stored 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  stored: ^0.1.0  # 请使用最新版本

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

2. 初始化存储

在你的 Dart 文件中导入 stored 插件并初始化存储:

import 'package:stored/stored.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化存储
  await stored.init();
  
  runApp(MyApp());
}

3. 存储数据

你可以使用 stored 来存储不同类型的数据,如字符串、整数、布尔值、列表和映射。

// 存储字符串
await stored.setString('key1', 'Hello, stored!');

// 存储整数
await stored.setInt('key2', 42);

// 存储布尔值
await stored.setBool('key3', true);

// 存储列表
await stored.setList('key4', [1, 2, 3]);

// 存储映射
await stored.setMap('key5', {'name': 'Flutter', 'version': '2.5'});

4. 检索数据

你可以使用 stored 来检索存储的数据:

// 检索字符串
String stringValue = await stored.getString('key1');

// 检索整数
int intValue = await stored.getInt('key2');

// 检索布尔值
bool boolValue = await stored.getBool('key3');

// 检索列表
List<dynamic> listValue = await stored.getList('key4');

// 检索映射
Map<dynamic, dynamic> mapValue = await stored.getMap('key5');

5. 删除数据

你可以使用 stored 来删除存储的数据:

// 删除单个键值对
await stored.remove('key1');

// 清除所有存储数据
await stored.clear();

6. 检查数据是否存在

你可以检查某个键是否存在:

bool exists = await stored.containsKey('key1');

7. 获取所有键

你可以获取所有存储的键:

List<String> keys = await stored.getKeys();

8. 使用示例

以下是一个完整的示例,展示了如何使用 stored 来存储和检索数据:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await stored.init();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Stored Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  await stored.setString('key1', 'Hello, stored!');
                  print('Data stored');
                },
                child: Text('Store Data'),
              ),
              ElevatedButton(
                onPressed: () async {
                  String value = await stored.getString('key1');
                  print('Retrieved value: $value');
                },
                child: Text('Retrieve Data'),
              ),
              ElevatedButton(
                onPressed: () async {
                  await stored.remove('key1');
                  print('Data removed');
                },
                child: Text('Remove Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部