Flutter数据保护插件sealed_writer的使用

Flutter数据保护插件sealed_writer的使用

sealed_writer 插件可以帮助你生成密封类(sealed classes)来更好地管理你的数据结构。以下是如何在 Flutter 中使用 sealed_writer 的完整示例。

添加依赖

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

dependencies:
  sealed_writer: ^latest.version

dev_dependencies:
  sealed_writer_generator: ^latest.version

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

导入库

接下来,导入 sealed_writer 库:

import 'package:sealed_writer/sealed_writer.dart';

定义密封类

使用 Manifest 类定义你的密封类。例如,我们定义一个表示天气状况的密封类:

void main() {
  final source = Manifest(
    name: 'Weather',
    items: [
      ManifestItem(
        name: 'WeatherSunny',
        shortName: 'sunny',
        equality: ManifestEquality.data,
        fields: [],
      ),
      ManifestItem(
        name: 'WeatherRainy',
        shortName: 'rainy',
        equality: ManifestEquality.data,
        fields: [
          ManifestField(
            name: 'rain',
            type: ManifestType(
              name: 'int',
              isNullable: false,
            ),
          ),
        ],
      ),
    ],
    params: [],
    fields: [],
  );
}

生成源代码

使用 SourceWriterBackwardWriter 生成源代码:

void main() {
  final source = Manifest(
    name: 'Weather',
    items: [
      ManifestItem(
        name: 'WeatherSunny',
        shortName: 'sunny',
        equality: ManifestEquality.data,
        fields: [],
      ),
      ManifestItem(
        name: 'WeatherRainy',
        shortName: 'rainy',
        equality: ManifestEquality.data,
        fields: [
          ManifestField(
            name: 'rain',
            type: ManifestType(
              name: 'int',
              isNullable: false,
            ),
          ),
        ],
      ),
    ],
    params: [],
    fields: [],
  );

  print('==============');
  print('FORWARD WRITER');
  print('==============');

  final forward = SourceWriter(source, referToManifest: false);
  print(forward.write());

  print('===============');
  print('BACKWARD WRITER');
  print('===============');

  final backward = BackwardWriter(source);
  print(backward.write());
}

示例代码解释

定义密封类

在上述代码中,我们定义了一个名为 Weather 的密封类,它包含两个子类:WeatherSunnyWeatherRainyWeatherRainy 类有一个名为 rain 的整型字段。

生成源代码

SourceWriterBackwardWriter 用于生成源代码。SourceWriter 生成前向代码,而 BackwardWriter 生成后向代码。这些代码将帮助你在运行时根据不同的情况执行不同的操作。

输出示例

以下是生成的源代码片段:

abstract class Weather {
  const factory Weather.sunny() = WeatherSunny;
  
  const factory Weather.rainy({required int rain}) = WeatherRainy;

  bool get isSunny => this is WeatherSunny;
  
  WeatherSunny get asSunny => this as WeatherSunny;

  WeatherSunny? get asSunnyOrNull {
    /* ... */
  }

  bool get isRainy => this is WeatherRainy;

  WeatherRainy get asRainy => this as WeatherRainy;

  WeatherRainy? get asRainyOrNull {
    /* ... */
  }

  R when<R extends Object?>({
    required R Function() sunny,
    required R Function(int rain) rainy,
  }) {
    /* ... */
  }

  R maybeWhen<R extends Object?>({
    R Function()? sunny,
    R Function(int rain)? rainy,
    required R Function(Weather weather) orElse,
  }) {
    /* ... */
  }

  R? whenOrNull<R extends Object?>({
    R Function()? sunny,
    R Function(int rain)? rainy,
    R Function(Weather weather)? orElse,
  }) {
    /* ... */
  }

  R map<R extends Object?>({
    required R Function(WeatherSunny sunny) sunny,
    required R Function(WeatherRainy rainy) rainy,
  }) {
    /* ... */
  }

  R maybeMap<R extends Object?>({
    R Function(WeatherSunny sunny)? sunny,
    R Function(WeatherRainy rainy)? rainy,
    required R Function(Weather weather) orElse,
  }) {
    /* ... */
  }

  R? mapOrNull<R extends Object?>({
    R Function(WeatherSunny sunny)? sunny,
    R Function(WeatherRainy rainy)? rainy,
    R Function(Weather weather)? orElse,
  }) {
    /* ... */
  }
}

class WeatherSunny extends Weather {
  const WeatherSunny();
}

class WeatherRainy extends Weather {
  WeatherRainy({required this.rain});
  
  final int rain;

  [@override](/user/override)
  String toString() => 'Weather.rainy(rain: $rain)';
}

更多关于Flutter数据保护插件sealed_writer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


sealed_writer 是一个 Flutter 插件,用于在本地存储中安全地写入和读取数据。它使用了 flutter_secure_storage 插件来存储加密数据,并且提供了一个简单的 API 来管理键值对。sealed_writer 的主要目的是确保敏感数据(如 API 密钥、用户凭证等)在设备上存储时是加密的,从而提高数据安全性。

安装 sealed_writer

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

dependencies:
  flutter:
    sdk: flutter
  sealed_writer: ^1.0.0  # 请使用最新版本

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

使用 sealed_writer

1. 初始化 SealedWriter

SealedWriter 是一个单例类,你通常只需要在应用的初始化阶段初始化一次。

import 'package:sealed_writer/sealed_writer.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SealedWriter
  await SealedWriter.initialize();
  
  runApp(MyApp());
}

2. 写入数据

你可以使用 SealedWriter.instance.write 方法来写入数据。数据将以加密形式存储在设备的本地存储中。

void writeData() async {
  await SealedWriter.instance.write(key: 'myKey', value: 'myValue');
}

3. 读取数据

使用 SealedWriter.instance.read 方法来读取存储的数据。

void readData() async {
  String? value = await SealedWriter.instance.read(key: 'myKey');
  print('Read value: $value');
}

4. 删除数据

你可以使用 SealedWriter.instance.delete 方法来删除存储的数据。

void deleteData() async {
  await SealedWriter.instance.delete(key: 'myKey');
}

5. 检查是否存在某个键

你可以使用 SealedWriter.instance.containsKey 方法来检查某个键是否存在。

void checkKey() async {
  bool exists = await SealedWriter.instance.containsKey(key: 'myKey');
  print('Key exists: $exists');
}

示例代码

以下是一个完整的示例,展示了如何使用 sealed_writer 来写入、读取和删除数据:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SealedWriter
  await SealedWriter.initialize();
  
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('SealedWriter Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: writeData,
                child: Text('Write Data'),
              ),
              ElevatedButton(
                onPressed: readData,
                child: Text('Read Data'),
              ),
              ElevatedButton(
                onPressed: deleteData,
                child: Text('Delete Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void writeData() async {
    await SealedWriter.instance.write(key: 'myKey', value: 'myValue');
    print('Data written');
  }

  void readData() async {
    String? value = await SealedWriter.instance.read(key: 'myKey');
    print('Read value: $value');
  }

  void deleteData() async {
    await SealedWriter.instance.delete(key: 'myKey');
    print('Data deleted');
  }
}
回到顶部