Flutter网络请求插件thor_request_dart的使用

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

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

1 回复

更多关于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"),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml文件中添加了thor_request_dart依赖项。
  2. 创建了一个Flutter应用,其中包含一个按钮用于触发网络请求。
  3. 使用ThorRequest实例进行GET和POST请求。
  4. 在GET请求成功后,将响应数据存储在responseData变量中,并显示在屏幕上。
  5. 打印POST请求的响应或错误。

请确保在实际项目中替换URL和请求数据为你自己的API端点和数据。

回到顶部