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
更多关于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');
}
}
}
在这个示例中:
_requestAccount
方法使用FlutterInjectedWeb3
实例请求用户账户。_fetchContractData
方法使用用户的账户信息和智能合约的ABI(应用程序二进制接口)来调用智能合约的函数并获取数据。
请注意:
- 你需要将
YOUR_CONTRACT_ADDRESS
替换为你的智能合约的实际地址。 - 你需要将ABI内容替换为你的智能合约的ABI。
- 你需要将
YOUR_FUNCTION_NAME
替换为你想调用的智能合约函数的名字。
这个示例仅展示了基本的交互,实际应用中可能需要更多的错误处理和用户交互逻辑。