Flutter自定义功能插件amberflutter的使用

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

Flutter自定义功能插件amberflutter的使用

amberflutter 是一个用于 Flutter 的插件,它为 Amber(一个 Nostr 签名器)提供了封装。通过该插件,开发者可以方便地在应用中使用 Amber 提供的功能。

动机

amberflutter 插件旨在为您的应用与 Amber 之间搭建一座桥梁,使得开发者能够轻松地利用 Amber 提供的各种功能。

安装

要将 amberflutter 添加到您的 Flutter 项目中,请执行以下命令:

flutter pub add amberflutter

或者手动添加到 pubspec.yaml 文件中:

dependencies:
  amberflutter: ^0.0.1

使用

文档主要参考自 Amber 文档,如果您有任何疑问,请参阅这些文档。

导入插件

首先,在您的 Dart 文件中导入 amberflutter

import 'package:amberflutter/amberflutter.dart';

获取公钥

获取当前用户的公钥(npub)。此请求还可以发送权限,以便用户可以永久批准它们。请参阅 Amber 文档 中的可用权限列表。

final amber = Amberflutter();

amber.getPublicKey(
  permissions: [
    Permission(
      type: "sign_event",
    ),
  ],
).then((value) {
  print("npub: ${value['signature']}");
});

签署事件

签署一个事件,例如发布一条消息。

final amber = Amberflutter();
final eventJson = jsonEncode({
  'id': '',
  'pubkey': Nip19.decodePubkey(_npub),
  'kind': 1,
  'content': 'Hello from Amber Flutter!',
  'created_at': (DateTime.now().millisecondsSinceEpoch / 1000).round(),
  'tags': [],
  'sig': '',
});

amber.signEvent(
  currentUser: "<your_npub_here>",
  eventJson: eventJson,
).then((value) {
  print("signed event: ${value['event']}");
});

使用 NIP-04 加密

使用 NIP-04 加密算法加密一段文本。

final amber = Amberflutter();

amber.nip04Encrypt(
  plaintext: "Hello from Amber Flutter, Nip 04!",
  currentUser: "<your_npub_here>",
  pubKey: "<hex_pubkey_to_encrypt>",
).then((value) {
  print("ciphertext: ${value['signature']}");
});

使用 NIP-44 加密

使用 NIP-44 加密算法加密一段文本。

final amber = Amberflutter();

amber.nip44Encrypt(
  plaintext: "Hello from Amber Flutter, NIP 44!",
  currentUser: "<your_npub_here>",
  pubKey: "<hex_pubkey_to_encrypt>",
).then((value) {
  print("ciphertext: ${value['signature']}");
});

使用 NIP-04 解密

使用 NIP-04 解密算法解密一段密文。

final amber = Amberflutter();

amber.nip04Decrypt(
  ciphertext: "<message_encrypted_with_nip04_here>",
  currentUser: "<your_npub_here>",
  pubKey: "<hex_pubkey_to_decrypt>",
).then((value) {
  print("plaintext: ${value['signature']}");
});

使用 NIP-44 解密

使用 NIP-44 解密算法解密一段密文。

final amber = Amberflutter();

amber.nip44Decrypt(
  ciphertext: "<message_encrypted_with_nip44_here>",
  currentUser: "<your_npub_here>",
  pubKey: "<hex_pubkey_to_decrypt>",
).then((value) {
  print("plaintext: ${value['signature']}");
});

检测 Amber 是否已安装

检查用户的设备上是否已安装 Amber 应用。

final amber = Amberflutter();

amber.isAppInstalled().then((value) {
  print("Amber is installed: $value");
});

示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用中使用 amberflutter 插件。

import 'package:flutter/material.dart';
import 'package:amberflutter/amberflutter.dart';
import 'package:nostr/nostr.dart';
import 'dart:convert';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'AmberFlutter Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final amber = Amberflutter();
  String _npub = '';
  String _pubkeyHex = '';
  String _text = '';
  String _cipherText = '';

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('AmberFlutter Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            FilledButton(
              onPressed: () {
                amber.getPublicKey(
                  permissions: [
                    const Permission(type: "nip04_encrypt"),
                    const Permission(type: "nip04_decrypt"),
                  ],
                ).then((value) {
                  _npub = value['signature'] ?? '';
                  _pubkeyHex = Nip19.decodePubkey(_npub);
                  setState(() {
                    _text = '$value';
                  });
                });
              },
              child: const Text('Get Public Key'),
            ),
            FilledButton(
              onPressed: () {
                final eventJson = jsonEncode({
                  'id': '',
                  'pubkey': Nip19.decodePubkey(_npub),
                  'kind': 1,
                  'content': 'Hello from Amber Flutter!',
                  'created_at': (DateTime.now().millisecondsSinceEpoch / 1000).round(),
                  'tags': [],
                  'sig': '',
                });

                amber
                    .signEvent(
                  currentUser: _npub,
                  eventJson: eventJson,
                )
                    .then((value) {
                  setState(() {
                    _text = '$value';
                  });
                });
              },
              child: const Text('Sign Event'),
            ),
            FilledButton(
              onPressed: () {
                amber
                    .nip04Encrypt(
                  plaintext: "Hello from Amber Flutter, Nip 04!",
                  currentUser: _npub,
                  pubKey: _pubkeyHex,
                )
                    .then((value) {
                  _cipherText = value['signature'] ?? '';
                  setState(() {
                    _text = '$value';
                  });
                });
              },
              child: const Text('Nip 04 Encrypt'),
            ),
            FilledButton(
              onPressed: () {
                amber
                    .nip04Decrypt(
                  ciphertext: _cipherText,
                  currentUser: _npub,
                  pubKey: _pubkeyHex,
                )
                    .then((value) {
                  setState(() {
                    _text = '$value';
                  });
                });
              },
              child: const Text('Nip 04 Decrypt'),
            ),
            FilledButton(
              onPressed: () {
                amber
                    .nip44Encrypt(
                  plaintext: "Hello from Amber Flutter, Nip 44!",
                  currentUser: _npub,
                  pubKey: _pubkeyHex,
                )
                    .then((value) {
                  _cipherText = value['signature'] ?? '';
                  setState(() {
                    _text = '$value';
                  });
                });
              },
              child: const Text('Nip 44 Encrypt'),
            ),
            FilledButton(
              onPressed: () {
                amber
                    .nip44Decrypt(
                  ciphertext: _cipherText,
                  currentUser: _npub,
                  pubKey: _pubkeyHex,
                )
                    .then((value) {
                  setState(() {
                    _text = '$value';
                  });
                });
              },
              child: const Text('Nip 44 Decrypt'),
            ),
            FilledButton(
              onPressed: () {
                amber.isAppInstalled().then((value) {
                  final snackBar = SnackBar(
                    content: Text('Amber is installed: $value'),
                  );
                  ScaffoldMessenger.of(context).showSnackBar(snackBar);
                });
              },
              child: const Text('Is Amber installed?'),
            ),
            Text(_text),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter自定义功能插件amberflutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义功能插件amberflutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用自定义功能插件amberflutter的示例代码。请注意,amberflutter是一个假设的插件名称,实际使用时需要替换为真实存在的插件名称及其功能。假设amberflutter提供了某种特定的功能,比如访问设备的某些硬件特性或执行特定的后台任务。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加amberflutter插件的依赖。确保你已经有一个Flutter项目,并且pubspec.yaml文件位于项目的根目录。

dependencies:
  flutter:
    sdk: flutter
  amberflutter: ^x.y.z  # 替换为实际的版本号

2. 导入插件

在你需要使用amberflutter插件的Dart文件中,导入该插件。

import 'package:amberflutter/amberflutter.dart';

3. 初始化插件

通常,插件需要在应用启动时进行初始化。这可以在main.dart文件的main函数或MyApp类的构造函数中完成。

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

void main() {
  // 初始化插件(如果插件需要初始化的话)
  AmberFlutter.instance.initialize();

  runApp(MyApp());
}

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

4. 使用插件功能

现在,你可以在你的应用中使用amberflutter插件提供的功能。假设插件有一个方法performTask,它返回一个Future<String>,表示任务的执行结果。

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

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

class _MyHomePageState extends State<MyHomePage> {
  String _result = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AmberFlutter Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Result: $_result',
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _performTask,
              child: Text('Perform Task'),
            ),
          ],
        ),
      ),
    );
  }

  void _performTask() async {
    try {
      String result = await AmberFlutter.instance.performTask();
      setState(() {
        _result = result;
      });
    } catch (e) {
      setState(() {
        _result = "Error: ${e.message}";
      });
    }
  }
}

5. 处理错误和权限

如果插件需要特定的权限(如访问摄像头、存储等),你需要在AndroidManifest.xmlInfo.plist文件中声明这些权限,并在运行时请求它们(如果适用)。

此外,确保处理插件可能抛出的异常和错误,以提供良好的用户体验。

注意事项

  • 确保amberflutter插件的文档是最新的,并且你使用的是与你的Flutter SDK版本兼容的插件版本。
  • 如果插件包含原生代码(如Android的Java/Kotlin或iOS的Swift/Objective-C),请确保在集成后运行flutter pub getflutter clean,然后重新构建项目。
  • 在发布应用之前,彻底测试插件的功能和性能。

希望这个示例能帮助你集成和使用amberflutter插件。如果有任何具体的问题或需要进一步的帮助,请随时提问。

回到顶部