Flutter微框架Nylo(六):存储

401 阅读3分钟

在 Nylo 中,您可以使用类 NyStorage 将数据保存到用户设备。在后台,Nylo使用flutter_secure_storage包来保存和检索数据。

1. 存储值

import 'package:nylo_framework/nylo_framework.dart';
...

NyStorage.store("com.company.myapp.coins", "10");

数据将使用 NyStorage 保留在用户的设备上。例如,如果他们退出应用程序,您可以检索之前存储的相同数据。

2. 检索值

import 'package:nylo_framework/nylo_framework.dart';
...

// Default
String coins = await NyStorage.read("com.company.myapp.coins"); // 10

// String
String coins = await NyStorage.read<String>("com.company.myapp.coins"); // 10

// Integer
int coins = await NyStorage.read<int>("com.company.myapp.coins"); // 10

// double
double coins = await NyStorage.read<double>("com.company.myapp.coins"); // 10.00

3. 存储密钥

该类可用于引用字符串,以便以后在 NyStorage 或 Backpack 类中使用。您可以使用 StorageKey 类来组织项目中的所有共享偏好字符串。

打开您的 Nylo 项目并打开“config/storage_keys.dart”文件。

请注意。此文件是在 Nylo v3.2.0 中添加的,如果缺少,可以手动添加。

/*
|--------------------------------------------------------------------------
| Storage Keys
| Add your storage keys here and then use them later to retrieve data.
| E.g. static String userCoins = "USER_COINS";
| String coins = NyStorage.read( StorageKey.userCoins );
|
| Learn more: https://nylo.dev/docs/5.x/storage#storage-keys
|--------------------------------------------------------------------------
*/

class StorageKey {
  static String userToken = "USER_TOKEN";

  /// Add your storage keys here...

}

如何在项目中使用?

import 'package:flutter_app/config/storage_keys.dart';
...

class _MyHomePageState extends NyState<MyHomePage> {

  @override
  init() async {
    // 存储
    await NyStorage.store( StorageKey.userToken , 'Anthony');

    // 检索
    String userName = await NyStorage.read( StorageKey.userToken );
  }

这个简单的类有助于组织存储变量的所有字符串键。

4. Backpack存储

Nylo 包含一个名为 Backpack 的轻量级存储类。此类设计用于在用户会话期间存储小块数据。

Backpack类不是异步的,因此您可以即时设置/获取数据。

  1. 设置数据
// 存储字符串
Backpack.instance.set('user_api_token', 'a secure token');

// 存储对象
User user = User();
Backpack.instance.set('user', user);

// 存储数字
Backpack.instance.set('my_lucky_no', 7);
  1. 读取数据
Backpack.instance.read('user_api_token'); // token

Backpack.instance.read('user'); // User实例

Backpack.instance.read('my_lucky_no'); // 7
  1. 实际使用

当您可能想要在 NyStorage 类上使用此类时,一个很好的例子是例如用于身份验证时存储用户的 api_token 。

// 登录
LoginResponse loginResponse = await _apiService.loginUser('email': '...', 'password': '...');

String userToken = loginResponse.token;
// 将用户token存储到 NyStorage 中,以便持久存储
await NyStorage.store('user_token', userToken);

// 将token存储到Backpack类,以确保用户在随后的应用程序接口请求中通过身份验证
Backpack.instance.set('user_token', userToken);

现在在我们的 API 服务中,我们可以从 Backpack 类设置身份验证请求头,而无需等待异步响应。

class ApiService extends BaseApiService {
  ...
  Future<dynamic> accountDetails() async {
    return await network(
        request: (request) {
          String userToken = Backpack.instance.read('user_api_token');

          // 设置请求头验证信息
          request.options.headers = {
            'Authorization': "Bearer " + userToken
          };
          
          return request.get("/account/1");
        },
    );
  }
}
  1. 使用Backpack持久保存数据

您可以使用该 NyStorage 类来保存数据,但如果还需要将其保存到应用的Backpack存储中,请使用以下参数“inBackpack”。

// 使用Backpack将数据存储在安全存储器和内存中
await NyStorage.store('user_token', 'a token 123', inBackpack: true);

// 用Backpack取回数据
Backpack.instance.read('user_token'); // "a token 123"

默认情况下,NyStorge 不会将数据存储在Backpack中,除非 inBackpack 参数设置为 true

5. 集合

当您想要存储事物的集合时,可以使用集合。例如,字符串、对象或整数的列表。下面是设置、获取和删除集合中的值的示例。

  1. 我们希望在用户每次点击“添加产品”时存储产品 ID 列表
  2. 在其他页面上显示产品 ID 列表
  3. 从集合中删除产品 ID
// 1 - 添加产品到集合
_addProduct(int productId) async {
  await NyStorage.addToCollection("product_ids", newItem: productId); // adds productId to the collection
}

// 2 - 页面展示数据, 例如. cart_page.dart
@override
Widget build(BuildContext context) {
  return Scaffold(
    body: SafeArea(
       child: NyFutureBuilder(future: NyStorage.readCollection("product_ids"), child: (context, data) {
         return ListView(
           children: data.map((productId) {
             return Text(productId.toString());
           }).toList(),
         );
       },)
    ),
  );
}

// 3 - 从集合中删除产品
_removeItemFromCollection(int index) async {
  await NyStorage.deleteFromCollection(index, key: "product_ids");
}
  1. 添加到集合

您可以通过调用 NyStorage.addToCollection("a_storage_key", newItem: "1"); 向集合添加新项目。

await NyStorage.addToCollection("a_storage_key", newItem: "1");
await NyStorage.addToCollection("a_storage_key", newItem: "2");
await NyStorage.addToCollection("a_storage_key", newItem: "3");

await NyStorage.readCollection("a_storage_key"); // ["1", "2", "3"]
  1. 检索集合

可以通过调用 NyStorage.readCollection("a_storage_key"); 来检索集合。

await NyStorage.addToCollection("a_storage_key", newItem: "Anthony");
await NyStorage.addToCollection("a_storage_key", newItem: "Kyle");

await NyStorage.readCollection("a_storage_key"); // ["Anthony", "Kyle"]
  1. 删除集合

可以通过调用 NyStorage.deleteCollection("a_storage_key"); 来删除集合。

await NyStorage.readCollection("a_storage_key"); // ["Anthony", "Kyle"]

await NyStorage.deleteFromCollection(0, "a_storage_key"); // ["Kyle"]