Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)
Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)
一个简化了集成Nostr Wallet Connect协议到客户端应用的dart包。
概述 #
NWC (Nostr Wallet Connect) 是一个Dart包。它为开发者提供了一个简单的方法来将他们的应用程序与NWC协议集成,通过标准化的协议实现对远程Lightning钱包的无缝访问。协议规范定义在NIP47中,此包是为了遵循这些规范而创建的。
特性 #
- 简单集成:轻松地将NWC协议实现到您的Nostr客户端或Flutter应用中,只需少量工作。
- 标准化协议:遵循NIP47中定义的规范,以确保一致性和可靠性。
- 安全通信:确保客户端与远程Lightning钱包之间的安全通信 (NIP04 实现)。
安装 #
在你的pubspec.yaml
文件中添加以下行:
dependencies:
nwc: ^1.0.0
然后运行:
$ flutter pub get
使用 #
初始化 "nwc" 包 #
要开始使用 "nwc" 包,首先需要将其导入到您的Dart项目中。然后实例化 NWC
类:
import 'package:nwc/nwc.dart';
final nwc = NWC();
解析连接 URI #
使用 parseNostrConnectUri
方法解析连接 URI,提取诸如公钥、中继器、密钥和lud16等重要信息,以便与远程Lightning钱包进行通信:
final parsedUri = nwc.nip47.parseNostrConnectUri(connectionURI);
初始化中继服务 #
在与远程钱包交互之前,需要初始化中继服务。这一步确保建立了适当的通信通道:
await nwc.relaysService.init(relaysUrl: [parsedUri.relay]);
订阅事件 #
您可以使用过滤器订阅来自远程钱包的特定事件。这允许您的应用程序响应相关的更新:
final subToFilter = Request(
filters: [
Filter(
kinds: [23195], // 23195 注册用于 NIP47 响应
authors: [parsedUri.pubkey], // 指定钱包服务的公钥
since: DateTime.now(), // 指定一个时间戳以开始过滤事件
),
],
);
final nostrStream = nwc.relaysService.startEventsSubscription(
request: subToFilter,
onEose: (relay, eose) =>
print('[+] subscriptionId: ${eose.subscriptionId}, relay: $relay'),
);
监听事件流 #
订阅后,您可以监听事件流并相应地做出反应。事件根据 NIP04 协议解密和处理:
nostrStream.stream.listen((Event event) {
if (event.kind == 23195 && event.content != null) {
try {
final decryptedContent = nwc.nip04.decrypt(
parsedUri.secret,
parsedUri.pubkey,
event.content!,
);
final content = nwc.nip47.parseResponseResult(decryptedContent);
// 处理不同类型事件
if (content.resultType == NWCResultType.get_balance) {
final result = content.result as Get_Balance_Result;
print('[+] Balance: ${result.balance} msat');
} else if (content.resultType == NWCResultType.make_invoice) {
final result = content.result as Make_Invoice_Result;
print('[+] Invoice: ${result.invoice}');
} else if (content.resultType == NWCResultType.pay_invoice) {
final result = content.result as Pay_Invoice_Result;
print('[+] Preimage: ${result.preimage}');
} else if (content.resultType == NWCResultType.error) {
final result = content.result as NWC_Error_Result;
print('[+] Preimage: ${result.errorMessage}');
} else {
print('[+] content: $decryptedContent');
}
} catch (e) {
if (e is DecipherFailedException) {
print('$e');
}
}
}
});
发送事件 #
最后,您可以使用适当的方法向远程钱包发送事件,这些方法在 NIP47 中定义。这允许您执行操作如获取余额、生成发票或进行支付:
final message = {"method": "get_balance"};
final content = nwc.nip04.encrypt(
parsedUri.secret,
parsedUri.pubkey,
jsonEncode(message),
);
final request = Event.fromPartialData(
kind: 23194,
content: content,
tags: [['p', parsedUri.pubkey]],
createdAt: DateTime.now(),
keyPairs: KeyPairs(private: parsedUri.secret),
);
final okCommand = await nwc.relaysService.sendEventToRelays(
request,
timeout: const Duration(seconds: 3),
);
print('[+] getBalance() => okCommand: $okCommand');
通过遵循这些步骤,您可以有效地将 “nwc” 包集成到您的Flutter应用中,从而通过NWC协议实现与远程Lightning钱包的无缝通信。
example/nwc_example.dart
import 'dart:convert';
import 'package:nwc/nwc.dart';
import 'package:nwc/src/utils/exceptions.dart';
const connectionURI = 'nostr+walletconnect://......';
Future<void> main() async {
final nwc = NWC();
final parsedUri = nwc.nip47.parseNostrConnectUri(connectionURI);
await nwc.relaysService.init(relaysUrl: [parsedUri.relay]);
final subToFilter = Request(
filters: [
Filter(
kinds: [23195],
authors: [parsedUri.pubkey],
since: DateTime.now(),
)
],
);
final nostrStream = nwc.relaysService.startEventsSubscription(
request: subToFilter,
onEose: (relay, eose) =>
print('[+] subscriptionId: ${eose.subscriptionId}, relay: $relay'),
);
nostrStream.stream.listen((Event event) {
if (event.kind == 23195 && event.content != null) {
try {
final decryptedContent = nwc.nip04.decrypt(
parsedUri.secret,
parsedUri.pubkey,
event.content!,
);
final content = nwc.nip47.parseResponseResult(decryptedContent);
if (content.resultType == NWCResultType.get_balance) {
final result = content.result as Get_Balance_Result;
print('[+] Balance: ${result.balance} msat');
} else if (content.resultType == NWCResultType.make_invoice) {
final result = content.result as Make_Invoice_Result;
print('[+] Invoice: ${result.invoice}');
} else if (content.resultType == NWCResultType.pay_invoice) {
final result = content.result as Pay_Invoice_Result;
print('[+] Preimage: ${result.preimage}');
} else if (content.resultType == NWCResultType.list_transactions) {
final result = content.result as List_Transactions_Result;
print(
'[+] First Tx description: ${result.transactions.first.description}');
} else if (content.resultType == NWCResultType.error) {
final result = content.result as NWC_Error_Result;
print('[+] Preimage: ${result.errorMessage}');
} else {
print('[+] content: $decryptedContent');
}
} catch (e) {
if (e is DecipherFailedException) {
print('$e');
}
}
}
});
await getBalance(nwc, parsedUri);
// await makeInvoice(nwc, parsedUri);
// await payInvoice(nwc, parsedUri);
await listTransactions(nwc, parsedUri);
}
Future<void> getBalance(NWC nwc, NostrWalletConnectUri parsedUri) async {
final message = {"method": "get_balance"};
final content = nwc.nip04.encrypt(
parsedUri.secret,
parsedUri.pubkey,
jsonEncode(message),
);
final request = Event.fromPartialData(
kind: 23194,
content: content,
tags: [
['p', parsedUri.pubkey]
],
createdAt: DateTime.now(),
keyPairs: KeyPairs(private: parsedUri.secret),
);
final okCommand = await nwc.relaysService.sendEventToRelays(
request,
timeout: const Duration(seconds: 3),
);
print('[+] getBalance() => okCommand: $okCommand');
}
Future<void> makeInvoice(NWC nwc, NostrWalletConnectUri parsedUri) async {
final amountInSats = 100;
final description = 'Hello Nostr Wallet Connect!';
final message = {
"method": "make_invoice",
"params": {
"amount": amountInSats * 1000, // 金额以毫秒计算
"description": description, // 发票描述,可选
}
};
final content = nwc.nip04.encrypt(
parsedUri.secret,
parsedUri.pubkey,
jsonEncode(message),
);
final request = Event.fromPartialData(
kind: 23194,
content: content,
tags: [
['p', parsedUri.pubkey]
],
createdAt: DateTime.now(),
keyPairs: KeyPairs(private: parsedUri.secret),
);
final okCommand = await nwc.relaysService.sendEventToRelays(
request,
timeout: const Duration(seconds: 3),
);
print('[+] makeInvoice() => okCommand: $okCommand');
}
Future<void> payInvoice(NWC nwc, NostrWalletConnectUri parsedUri) async {
final invoice = 'lnbc1240n1pnrm654pp5q9evu4tpgd2f8luaz5vscezc5j84m7yqv2vk0h735r6mvc9ujwusdqu2askcmr9wssx7e3q2dshgmmndp5scqzzsxqyz5vqsp5rjq5vef8nuv4adtrlr22n5su5nkt9dh3xw8953yesg8f28n4k4js9qyyssqy80q0a057s67qz3cepdkfeucjnga6w08zsk7pp8eq9wuxkfr65uney4a4vs5c78k3vl7e43s0j97nwqrvc2s7k585j3p9gxfylp3ewgpwt3j6m';
final message = {
"method": "pay_invoice",
"params": {
"invoice": invoice,
}
};
final content = nwc.nip04.encrypt(
parsedUri.secret,
parsedUri.pubkey,
jsonEncode(message),
);
final request = Event.fromPartialData(
kind: 23194,
content: content,
tags: [
['p', parsedUri.pubkey]
],
createdAt: DateTime.now(),
keyPairs: KeyPairs(private: parsedUri.secret),
);
final okCommand = await nwc.relaysService.sendEventToRelays(
request,
timeout: const Duration(seconds: 3),
);
print('[+] payInvoice() => okCommand: $okCommand');
}
Future<void> listTransactions(NWC nwc, NostrWalletConnectUri parsedUri) async {
final message = {
"method": "list_transactions",
"params": {
"limit": 10,
}
};
final content = nwc.nip04.encrypt(
parsedUri.secret,
parsedUri.pubkey,
jsonEncode(message),
);
final request = Event.fromPartialData(
kind: 23194,
content: content,
tags: [
['p', parsedUri.pubkey]
],
createdAt: DateTime.now(),
keyPairs: KeyPairs(private: parsedUri.secret),
);
final okCommand = await nwc.relaysService.sendEventToRelays(
request,
timeout: const Duration(seconds: 3),
);
print('[+] listTransactions() => okCommand: $okCommand');
}
更多关于Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter未知功能插件nwc的使用(注意:由于介绍为undefined,以下基于插件名称推测)的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,使用第三方插件通常涉及以下几个步骤:添加依赖、导入包、初始化插件以及调用插件提供的功能。尽管你提到的 nwc
插件在官方文档中未被定义,但基于插件名称和常见 Flutter 插件的使用模式,以下是一个推测性的代码示例,展示了如何在一个 Flutter 项目中使用一个假定的 nwc
插件。
步骤 1: 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 nwc
插件的依赖。请注意,这里的版本号是一个占位符,你需要替换为实际可用的版本号(如果插件存在的话)。
dependencies:
flutter:
sdk: flutter
nwc: ^x.y.z # 替换为实际版本号
然后,运行 flutter pub get
命令来安装依赖。
步骤 2: 导入包
在你的 Dart 文件中导入 nwc
包。
import 'package:nwc/nwc.dart';
步骤 3: 初始化插件(如果需要)
某些插件可能需要在应用启动时进行初始化。如果 nwc
插件有这样的要求,你可能会在应用的主入口点(如 main.dart
)中找到初始化代码。
void main() {
// 假设 nwc 插件有一个初始化方法
NwcPlugin.instance.initialize().then((_) {
runApp(MyApp());
}).catchError((error) {
// 处理初始化错误
print('Failed to initialize nwc plugin: $error');
runApp(ErrorHandlingApp()); // 一个处理错误的替代应用
});
}
注意:上述 initialize
方法是一个假设性的方法。你需要查阅 nwc
插件的实际文档来了解如何正确初始化它。
步骤 4: 使用插件功能
假设 nwc
插件提供了一个名为 performAction
的方法,你可以这样调用它:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('nwc Plugin Demo'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
try {
// 调用 nwc 插件的 performAction 方法
var result = await NwcPlugin.instance.performAction();
// 处理结果
print('Action performed successfully. Result: $result');
} catch (error) {
// 处理错误
print('Failed to perform action: $error');
}
},
child: Text('Perform Action'),
),
),
),
);
}
}
总结
上述代码是一个基于假设的示例,展示了如何在 Flutter 项目中使用一个名为 nwc
的未知插件。由于 nwc
插件的具体功能和 API 未知,你需要查阅该插件的实际文档来了解如何正确安装、初始化和使用它。如果 nwc
插件实际上不存在,你可能需要寻找一个满足你需求的替代插件或自己实现所需的功能。