Flutter Web3交互插件flutter_injected_web3的使用

Flutter Web3交互插件flutter_injected_web3的使用

概述

flutter_injected_web3 是一个用于在Flutter应用中与Web3进行交互的插件。它封装了Trust Wallet的Web3提供程序的一个稍作修改的版本,你可以在 这里 找到该提供程序。

注意:这是一个早期版本,我们将在必要时或有时间时对其进行更新。欢迎提交PR以帮助改进。

特性

在大多数去中心化应用(dApps)中,你会看到一个“注入式Web3”的选项。如果没有这样的选项,你可以选择MetaMask、Trust钱包或其他任何注入Web3的钱包。

入门指南

如果你正在使用 flutter_inappwebview,可以直接从 flutter_injected_web3 包本身进行集成。

使用方法

以下是一个完整的示例,展示了如何使用 flutter_injected_web3 插件:

import 'package:flutter/material.dart';
import 'package:flutter_injected_web3/flutter_injected_web3.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:web3dart/credentials.dart';
import 'package:web3dart/crypto.dart';
import 'package:web3dart/web3dart.dart';

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

// 忽略: 必须是不可变的
class MyApp extends StatelessWidget {
  String rpc = "https://rpc.ankr.com/polygon";
  int chainId = 137;

  MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(),
        body: InjectedWebview(
          addEthereumChain: changeNetwork,
          requestAccounts: getAccount,
          signTransaction: signTransaction,
          signPersonalMessage: signPersonelMessage,
          isDebug: true,
          initialUrlRequest: URLRequest(url: Uri.parse('https://opensea.io/')),
          chainId: chainId,
          rpc: rpc,
        ),
      ),
    );
  }

  // 处理添加以太坊链的方法
  Future<String> changeNetwork(InAppWebViewController controller,
      JsAddEthereumChain data, int chainId) async {
    try {
      rpc = "https://rpc.ankr.com/eth";
      chainId = int.parse(data.chainId!);
    } catch (e) {
      debugPrint("$e");
    }
    return rpc;
  }

  // 获取账户信息
  Future<IncomingAccountsModel> getAccount(
      InAppWebViewController _, String ___, int __) async {
    Credentials fromHex = EthPrivateKey.fromHex(
        "Private key here"); // 这里替换为你的私钥
    final address = await fromHex.extractAddress();
    return IncomingAccountsModel(
        address: address.toString(), chainId: chainId, rpcUrl: rpc);
  }

  // 签名交易
  Future<String> signTransaction(
      InAppWebViewController _, JsTransactionObject data, int chainId) async {
    return "0x45fb0060681bf5d8ea675ab0b3f76aa15c84b172f2fb3191b7a8ceb1e6a7f372";
  }

  // 签名个人消息
  Future<String> signPersonelMessage(
      InAppWebViewController _, String data, int chainId) async {
    try {
      Credentials fromHex = EthPrivateKey.fromHex(
          "Private key here"); // 这里替换为你的私钥
      final sig = await fromHex.signPersonalMessage(hexToBytes(data));

      debugPrint("SignedTx ${sig}");
      return bytesToHex(sig, include0x: true);
    } catch (e) {
      debugPrint("$e");
    }
    return "";
  }
}

更多关于Flutter Web3交互插件flutter_injected_web3的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Web3交互插件flutter_injected_web3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用flutter_injected_web3插件与Web3进行交互的代码案例。这个插件允许Flutter应用与已经注入MetaMask等Web3钱包的浏览器进行交互。

首先,确保你的Flutter环境已经设置好,并且已经添加了flutter_injected_web3依赖到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  flutter_injected_web3: ^x.y.z  # 请替换为最新版本号

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

接下来是一个简单的Flutter应用示例,它展示了如何使用flutter_injected_web3插件来请求账户信息并读取一个智能合约的数据。

import 'package:flutter/material.dart';
import 'package:flutter_web3/flutter_web3.dart';
import 'package:flutter_injected_web3/flutter_injected_web3.dart';
import 'dart:convert';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  String? accountAddress;
  String? contractData;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Web3 Interaction'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              'Account Address:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 8),
            Text(
              accountAddress ?? 'Not connected',
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 24),
            Text(
              'Contract Data:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 8),
            Text(
              contractData ?? 'Not fetched',
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: _requestAccount,
              child: Text('Request Account'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _fetchContractData,
              child: Text('Fetch Contract Data'),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> _requestAccount() async {
    final injectedWeb3 = FlutterInjectedWeb3();

    try {
      final accounts = await injectedWeb3.requestAccounts();
      setState(() {
        accountAddress = accounts.isNotEmpty ? accounts.first : null;
      });
    } catch (e) {
      print('Error requesting account: $e');
    }
  }

  Future<void> _fetchContractData() async {
    final injectedWeb3 = FlutterInjectedWeb3();
    final contractAddress = 'YOUR_CONTRACT_ADDRESS'; // 替换为你的智能合约地址
    final abi = jsonDecode('''
      // 替换为你的智能合约的ABI
      [
        // ABI内容
      ]
    ''');

    try {
      final ethClient = injectedWeb3.makeWeb3Client();
      final contract = Contract(ethClient, ContractAddress.fromHex(contractAddress), abi);
      final data = await contract.call('YOUR_FUNCTION_NAME', [], options: CallOptions(block: 'latest'));
      setState(() {
        contractData = data.toString();
      });
    } catch (e) {
      print('Error fetching contract data: $e');
    }
  }
}

在这个示例中:

  1. _requestAccount方法使用FlutterInjectedWeb3实例请求用户账户。
  2. _fetchContractData方法使用用户的账户信息和智能合约的ABI(应用程序二进制接口)来调用智能合约的函数并获取数据。

请注意:

  • 你需要将YOUR_CONTRACT_ADDRESS替换为你的智能合约的实际地址。
  • 你需要将ABI内容替换为你的智能合约的ABI。
  • 你需要将YOUR_FUNCTION_NAME替换为你想调用的智能合约函数的名字。

这个示例仅展示了基本的交互,实际应用中可能需要更多的错误处理和用户交互逻辑。

回到顶部