Flutter区块链交互插件web3_provider的使用

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

Flutter区块链交互插件web3_provider的使用

插件介绍

web3_provider 是一个用于在Flutter应用中与区块链进行交互的插件。它支持Dapp(去中心化应用程序)与App之间的消息传递,仅支持EIP-1193标准。

使用说明

  1. 通信
    • 项目支持Dapp和 App之间发送和接收消息。

2插件提供了以下功能:

  • requestAccounts: 当Web应用连接钱包时触发。
  • signTransaction: 当Web应用批准合约或发送交易时触发。
  • signMessage: 当Web应用签名消息时触发。
  • signPersonalMessage: 当Web应用签名个人消息时触发。
  • signTypedMessage: 当Web应用签名类型消息时触发。
  • addEthereumChain: 当Web应用添加新链时触发。

示例代码

import 'package:web3_provider/web3_provider.dart';

InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
  crossPlatform: InAppWebViewOptions(
    useShouldOverrideUrlLoading: true,
    mediaPlaybackRequiresUserGesture: false,
    userAgent:
        "Mozilla/5.0 (Linux; Android 4.4.4; SAMSUNG-SM-N900A Build/tt) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36",
  ),
  android: AndroidInAppWebViewOptions(
    useHybridComposition: true,
    domStorageEnabled: true,
  ),
  ios: IOSInAppWebViewOptions(
    allowsInlineMediaPlayback: true,
  ),
);

/// By default config
InAppWebViewEIP1193(
    chainId: 56, // 替换你的网络ID
    rpcUrl: 'https://bsc-dataseed.binance.org/', // 替换你的RPC URL
    walletAddress: walletAddress,
    signCallback: (rawData, eip1193, controller) {
      // Handler callback when dapp interact with blockchain
      switch (eip1193 {
        case EIP1193.requestAccounts:
          controller?.setAddress(walletAddress, id);
          print('requestAccounts');
          break;
        case EIP1193.signTransaction:
          print('signTransaction');
          break;
        case EIP1193.signMessage:
          print('signMessage');
          break;
        case EIP1193.signPersonalMessage:
          print('signPersonalMessage');
          break;
        case EIP1193.signTypedMessage:
          print('addEthereumChain');
          break;
        case EIP1193.addEthereumChain:
          print('addEthereumChain');
          break;  
      },
    initialUrlRequest: URLRequest(
        url: Uri.parse(
        'https://position.exchange', // 替换你的dapp域名
        ),
    ),
    initialOptions: options
);

从Dapp到App的数据传递

const args = {/* Pass data you want */};
if (window.flutter_inappwebview.callHandler) {
    window.flutter_inappwebview.callHandler('functionName', args)
        .then(function(result) {
          /// Receive data from your app
    });
}

在App中接收数据

onWebViewCreated: (controller) {
    controller.addJavaScriptHandler(
        handlerName: 'functionName',
        callback: (args) {
          /// Receive data from dapp
          
          
          /// Send data to dapp;
          return /* anything */;
        },
    );
},

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

1 回复

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


当然,下面是一个关于如何在Flutter应用中使用web3_provider插件与区块链进行交互的代码示例。这个示例将展示如何连接到MetaMask或其他兼容的Web3钱包,并获取用户的账户地址。

首先,确保你已经添加了web3dartweb3_provider到你的Flutter项目的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  web3dart: ^2.0.0  # 请检查最新版本
  web3_provider: ^0.1.0  # 请检查最新版本

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

接下来,我们编写Flutter代码来实现与区块链的交互。以下是一个简单的示例,展示如何连接到Web3钱包并获取账户地址:

import 'package:flutter/material.dart';
import 'package:web3dart/web3dart.dart';
import 'package:web3_provider/web3_provider.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Web3 Provider Example'),
        ),
        body: Center(
          child: Web3ProviderExample(),
        ),
      ),
    );
  }
}

class Web3ProviderExample extends StatefulWidget {
  @override
  _Web3ProviderExampleState createState() => _Web3ProviderExampleState();
}

class _Web3ProviderExampleState extends State<Web3ProviderExample> {
  String? accountAddress;

  @override
  void initState() {
    super.initState();
    _connectToWeb3Provider();
  }

  Future<void> _connectToWeb3Provider() async {
    try {
      // 尝试获取Web3提供者
      final provider = await Web3Provider.connect('http://localhost:8545');  // 替换为你的Ethereum节点URL

      // 请求账户权限
      final accounts = await provider.requestAccounts();
      if (accounts.isNotEmpty) {
        // 获取第一个账户地址
        final firstAccount = accounts.first;
        
        // 更新状态
        setState(() {
          accountAddress = firstAccount;
        });

        // 打印账户地址到控制台(仅用于调试)
        print('Connected account: $firstAccount');
      } else {
        print('No accounts granted access.');
      }
    } catch (e) {
      print('Error connecting to Web3 provider: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'Web3 Provider Example',
          style: TextStyle(fontSize: 24),
        ),
        SizedBox(height: 20),
        if (accountAddress != null)
          Text(
            'Connected Account: $accountAddress',
            style: TextStyle(fontSize: 20, color: Colors.green),
          )
        else
          Text(
            'Connecting...',
            style: TextStyle(fontSize: 20, color: Colors.grey),
          ),
      ],
    );
  }
}

注意事项

  1. Ethereum节点URL:在Web3Provider.connect('http://localhost:8545')中,'http://localhost:8545'应该替换为你自己的Ethereum节点URL,或者是一个公开的Ethereum节点,比如Infura的节点。但是,请注意使用公开节点可能存在安全风险。

  2. MetaMask连接:这段代码假设你的应用是在支持Web3的浏览器中运行的(如Chrome,并且安装了MetaMask扩展)。在移动设备上,MetaMask的集成方式可能会有所不同,可能需要使用其他库或方法。

  3. 权限请求provider.requestAccounts()会弹出一个对话框,要求用户授权访问其账户。用户必须授权,代码才能继续执行并获取账户地址。

  4. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑来处理连接失败、用户拒绝授权等情况。

  5. 安全性:不要在生产环境中硬编码Ethereum节点URL或私钥。确保你的应用遵循最佳的安全实践。

这个示例提供了一个基本的框架,你可以在此基础上扩展以实现更复杂的区块链交互功能。

回到顶部