Flutter网络请求插件thor_request_dart的使用
Flutter网络请求插件thor_request_dart的使用
thor_request_dart
是一个用于与VeChain区块链进行交互的Flutter插件。它提供了丰富的API,涵盖了合约交互、VET和VTHO转账以及交易调试等功能。本文将详细介绍如何使用 thor_request_dart
插件,并提供一个完整的示例Demo。
1. 快速开始
首先,在你的Flutter项目中添加 thor_request_dart
依赖。你可以在 pubspec.yaml
文件中添加以下内容:
dependencies:
thor_request_dart: ^x.x.x # 请根据实际情况替换为最新版本号
然后,运行 flutter pub get
来安装依赖。
接下来,你可以通过以下代码快速连接到VeChain测试网:
import 'package:thor_request_dart/connect.dart';
void main() {
// 连接到VeChain测试网
Connect connector = Connect("https://testnet.veblocks.net");
// 打印链标签 (Chain Tag)
print(connector.getChainTag());
}
2. API参考
2.1 钱包操作
thor_request_dart
提供了多种方式来创建和管理钱包:
-
从私钥创建钱包:
Wallet wallet = Wallet.fromPrivate(Uint8List.fromList([/* 私钥字节数组 */]));
-
从助记词创建钱包:
Wallet wallet = Wallet.fromMnemonic(['word1', 'word2', /* 助记词列表 */]);
-
从Keystore文件创建钱包:
Wallet wallet = Wallet.fromKeyStore("keystore.json", "password");
-
创建一个新的随机钱包:
Wallet wallet = Wallet.newWallet();
2.2 合约操作
你可以通过JSON格式的合约元数据来创建合约对象:
-
从JSON字符串创建合约:
Contract contract = Contract('{"contract metadata JSON"}');
-
从文件加载合约:
Contract contract = Contract.fromFile("/path/to/smart_contract.json");
2.3 区块链查询
thor_request_dart
提供了多种查询区块链信息的方法:
-
获取账户信息:
Map<String, dynamic> accountInfo = connector.getAccount('0x7567d83b7b8d80addcb281a71d54fc7b3364ffed'); print(accountInfo);
-
获取区块信息:
Map<String, dynamic> blockInfo = connector.getBlock('0x0084f21562e046b1ae9aa70b6cd3b7bc2e8312f3961716ee3fcd58ce8bcb7392'); print(blockInfo);
-
获取交易信息:
Map<String, dynamic> txInfo = connector.getTransaction('0xda2ce6bddfb3bd32541c999e81ef56019a6314a23c90a466896aeefca33aebc1'); print(txInfo);
-
获取交易收据:
Map<String, dynamic> receipt = connector.getTransactionReceipt('0xda2ce6bddfb3bd32541c999e81ef56019a6314a23c90a466896aeefca33aebc1'); print(receipt);
2.4 合约调用
你可以模拟调用合约函数(不会消耗Gas)或执行合约函数(会消耗Gas)。
-
模拟调用合约函数:
Map<String, dynamic> result = connector.call( '0x7567d83b7b8d80addcb281a71d54fc7b3364ffed', contract, "balanceOf", ['0x7567d83b7b8d80addcb281a71d54fc7b3364ffed'], to: _contract_addr, ); print(result);
-
执行合约函数:
Map<String, dynamic> result = connector.transact( wallet, contract, "deposit", [], to: _contract_addr, value: BigInt.from(5 * 10^18), // 5 VET ); print(result);
2.5 多子句支持 (MTT)
thor_request_dart
支持多子句交易(Multi-Typed Transaction),可以同时执行多个合约函数。
- 创建多子句交易:
Clause clause1 = connector.clause(contract, "function1", [], _contract_addr, value: BigInt.from(1 * 10^18)).getDevClause(); Clause clause2 = connector.clause(contract, "function2", [], _contract_addr, value: BigInt.from(2 * 10^18)).getDevClause(); // 执行多子句交易 Map<String, dynamic> result = connector.transactMulti( wallet, [clause1, clause2], gasPriceCoef: 0, gas: 0, expiration: 32, ); print(result);
2.6 转账操作
你可以使用 thor_request_dart
来发送VET、VTHO或其他VIP180代币。
-
发送VET:
connector.transferVet( wallet, '0x0000000000000000000000000000000000000000', value: BigInt.from(3 * 10^18), // 3 VET );
-
发送VTHO:
connector.transferVtho( wallet, '0x0000000000000000000000000000000000000000', vthoInWei: BigInt.from(3 * 10^18), // 3 VTHO );
-
发送其他VIP180代币:
connector.transferToken( wallet, '0x0000000000000000000000000000000000000000', tokenContractAddress: '0x0ce6661b4ba86a0ea7ca2bd86a0de87b0b860f14', // OCE智能合约地址 amountInWei: BigInt.from(3 * 10^18), // 3 OCE );
2.7 VIP-191费用委托功能
thor_request_dart
支持VIP-191费用委托功能,允许你使用不同的钱包来支付交易费用。
-
使用费用委托发送交易:
Map<String, dynamic> result = connector.transact( senderWallet, contract, "deposit", [], to: _contract_addr, value: BigInt.from(5 * 10^18), // 5 VET gasPayer: payerWallet, // 使用payerWallet支付Gas费用 ); print(result);
-
使用费用委托发送VET:
connector.transferVet( senderWallet, '0x0000000000000000000000000000000000000000', value: BigInt.from(3 * 10^18), // 3 VET gasPayer: payerWallet, // 使用payerWallet支付Gas费用 );
3. 完整示例Demo
以下是一个完整的示例Demo,展示了如何使用 thor_request_dart
插件来部署合约、调用合约函数、发送VET以及处理VIP-191费用委托。
import 'package:thor_request_dart/connect.dart';
import 'package:thor_request_dart/wallet.dart';
import 'package:thor_request_dart/contract.dart';
void main() async {
// 连接到VeChain测试网
Connect connector = Connect("https://testnet.veblocks.net");
// 创建钱包
Wallet wallet = Wallet.fromPrivateKey(Uint8List.fromList([
0xdc, 0xe1, 0x44, 0x3b, 0xd2, 0xef, 0x0c, 0x26, 0x31, 0xad, 0xc1, 0xc6, 0x7e, 0x5c, 0x93, 0xf1,
0x3d, 0xc2, 0x3a, 0x41, 0xc1, 0x8b, 0x53, 0x6e, 0xff, 0xbb, 0xdc, 0xbc, 0xdb, 0x96, 0xfb, 0x65
]));
// 加载合约
Contract contract = Contract.fromFile("/path/to/solc/compiled/smart_contract.json");
// 1. 部署合约
print("正在部署合约...");
Map<String, dynamic> deployResult = await connector.deploy(wallet, contract);
print("合约已部署,交易ID: ${deployResult['id']}");
// 2. 模拟调用合约函数 (不会消耗Gas)
print("模拟调用合约函数 balanceOf...");
Map<String, dynamic> callResult = await connector.call(
'0x7567d83b7b8d80addcb281a71d54fc7b3364ffed',
contract,
"balanceOf",
['0x7567d83b7b8d80addcb281a71d54fc7b3364ffed'],
to: contract.address,
);
print("模拟调用结果: ${callResult['decoded']}");
// 3. 执行合约函数 (会消耗Gas)
print("执行合约函数 deposit...");
Map<String, dynamic> transactResult = await connector.transact(
wallet,
contract,
"deposit",
[],
to: contract.address,
value: BigInt.from(5 * 10^18), // 5 VET
);
print("执行结果: ${transactResult['id']}");
// 4. 发送VET
print("发送3 VET...");
connector.transferVet(
wallet,
'0x0000000000000000000000000000000000000000',
value: BigInt.from(3 * 10^18), // 3 VET
);
// 5. 使用VIP-191费用委托发送VET
print("使用VIP-191费用委托发送3 VET...");
Wallet payerWallet = Wallet.fromPrivateKey(Uint8List.fromList([
0xdc, 0xe1, 0x44, 0x3b, 0xd2, 0xef, 0x0c, 0x26, 0x31, 0xad, 0xc1, 0xc6, 0x7e, 0x5c, 0x93, 0xf1,
0x3d, 0xc2, 0x3a, 0x41, 0xc1, 0x8b, 0x53, 0x6e, 0xff, 0xbb, 0xdc, 0xbc, 0xdb, 0x96, 0xfb, 0x65
]));
connector.transferVet(
wallet,
'0x0000000000000000000000000000000000000000',
value: BigInt.from(3 * 10^18), // 3 VET
gasPayer: payerWallet, // 使用payerWallet支付Gas费用
);
print("所有操作已完成!");
}
更多关于Flutter网络请求插件thor_request_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter网络请求插件thor_request_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用thor_request_dart
插件进行网络请求的示例代码。thor_request_dart
是一个Flutter网络请求库,它简化了HTTP请求的处理。
首先,你需要在你的pubspec.yaml
文件中添加thor_request_dart
依赖项:
dependencies:
flutter:
sdk: flutter
thor_request_dart: ^最新版本号 # 请替换为实际可用的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter项目中使用thor_request_dart
进行网络请求。以下是一个完整的示例,展示了如何进行GET和POST请求:
import 'package:flutter/material.dart';
import 'package:thor_request_dart/thor_request_dart.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String responseData = "";
void fetchData() async {
// 创建一个ThorRequest实例
var thorRequest = ThorRequest();
// 示例GET请求
var getResponse = await thorRequest.get(
url: "https://jsonplaceholder.typicode.com/posts/1",
headers: {
'Content-Type': 'application/json',
},
);
// 处理GET请求响应
if (getResponse.isSuccessful) {
setState(() {
responseData = getResponse.data.toString();
});
print("GET Response: ${getResponse.data}");
} else {
print("GET Error: ${getResponse.error}");
}
// 示例POST请求
var postData = {
"title": "foo",
"body": "bar",
"userId": 1,
};
var postResponse = await thorRequest.post(
url: "https://jsonplaceholder.typicode.com/posts",
headers: {
'Content-Type': 'application/json',
},
body: postData,
);
// 处理POST请求响应
if (postResponse.isSuccessful) {
print("POST Response: ${postResponse.data}");
} else {
print("POST Error: ${postResponse.error}");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Flutter Demo"),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text("Response Data:"),
Text(responseData),
SizedBox(height: 20),
ElevatedButton(
onPressed: fetchData,
child: Text("Fetch Data"),
),
],
),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 在
pubspec.yaml
文件中添加了thor_request_dart
依赖项。 - 创建了一个Flutter应用,其中包含一个按钮用于触发网络请求。
- 使用
ThorRequest
实例进行GET和POST请求。 - 在GET请求成功后,将响应数据存储在
responseData
变量中,并显示在屏幕上。 - 打印POST请求的响应或错误。
请确保在实际项目中替换URL和请求数据为你自己的API端点和数据。