Flutter钱包管理插件reown_walletkit的使用
Flutter钱包管理插件reown_walletkit的使用
Reown - WalletKit Flutter
Reown 是一个基于区块链的用户体验平台,提供了构建在 WalletConnect 网络之上的工具包,使开发者能够创建直观、安全且易于使用的数字所有权体验。
了解更多请访问我们的 官方网站
文档
完整的参考文档请查看 官方文档
示例
您可以查看 示例代码 文件夹获取更多示例。
使用示例
以下是一个完整的示例demo,展示了如何使用 reown_walletkit
插件来创建一个多链钱包应用。此应用支持EVM、Kadena、Polkadot、Solana和Cosmos等多条链,并集成了底部导航栏和侧边栏导航。
import 'package:get_it/get_it.dart';
import 'package:reown_walletkit_wallet/dependencies/bottom_sheet/bottom_sheet_listener.dart';
import 'package:reown_walletkit_wallet/dependencies/bottom_sheet/bottom_sheet_service.dart';
import 'package:reown_walletkit_wallet/dependencies/bottom_sheet/i_bottom_sheet_service.dart';
import 'package:reown_walletkit_wallet/dependencies/chain_services/cosmos_service.dart';
import 'package:reown_walletkit_wallet/dependencies/chain_services/evm_service.dart';
import 'package:reown_walletkit_wallet/dependencies/chain_services/kadena_service.dart';
import 'package:reown_walletkit_wallet/dependencies/chain_services/polkadot_service.dart';
import 'package:reown_walletkit_wallet/dependencies/chain_services/solana_service_2.dart';
import 'package:reown_walletkit_wallet/dependencies/deep_link_handler.dart';
import 'package:reown_walletkit_wallet/dependencies/i_walletkit_service.dart';
import 'package:reown_walletkit_wallet/dependencies/key_service/i_key_service.dart';
import 'package:reown_walletkit_wallet/dependencies/key_service/key_service.dart';
import 'package:reown_walletkit_wallet/dependencies/walletkit_service.dart';
import 'package:reown_walletkit_wallet/models/chain_data.dart';
import 'package:reown_walletkit_wallet/models/page_data.dart';
import 'package:reown_walletkit_wallet/pages/apps_page.dart';
import 'package:reown_walletkit_wallet/pages/settings_page.dart';
import 'package:reown_walletkit_wallet/utils/constants.dart';
import 'package:flutter/material.dart';
import 'package:reown_walletkit_wallet/utils/string_constants.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
DeepLinkHandler.initListener();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: StringConstants.appTitle,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({super.key});
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _initializing = true;
List<PageData> _pageDatas = [];
int _selectedIndex = 0;
@override
void initState() {
super.initState();
initialize();
}
Future<void> initialize() async {
GetIt.I.registerSingleton<IBottomSheetService>(BottomSheetService());
GetIt.I.registerSingleton<IKeyService>(KeyService());
final walletKitService = WalletKitService();
await walletKitService.create();
GetIt.I.registerSingleton<IWalletKitService>(walletKitService);
// 支持EVM链
for (final chainData in ChainsDataList.eip155Chains) {
GetIt.I.registerSingleton<EVMService>(
EVMService(chainSupported: chainData),
instanceName: chainData.chainId,
);
}
// 支持Kadena链
for (final chainData in ChainsDataList.kadenaChains) {
GetIt.I.registerSingleton<KadenaService>(
KadenaService(chainSupported: chainData),
instanceName: chainData.chainId,
);
}
// 支持Polkadot链
for (final chainData in ChainsDataList.polkadotChains) {
GetIt.I.registerSingleton<PolkadotService>(
PolkadotService(chainSupported: chainData),
instanceName: chainData.chainId,
);
}
// 支持Solana链
for (final chainData in ChainsDataList.solanaChains) {
GetIt.I.registerSingleton<SolanaService2>(
SolanaService2(chainSupported: chainData),
instanceName: chainData.chainId,
);
}
// 支持Cosmos链
for (final chainData in ChainsDataList.cosmosChains) {
GetIt.I.registerSingleton<CosmosService>(
CosmosService(chainSupported: chainData),
instanceName: chainData.chainId,
);
}
await walletKitService.init();
walletKitService.walletKit.core.relayClient.onRelayClientConnect.subscribe(
_setState,
);
walletKitService.walletKit.core.relayClient.onRelayClientDisconnect.subscribe(
_setState,
);
setState(() {
_pageDatas = [
PageData(
page: AppsPage(),
title: StringConstants.connectPageTitle,
icon: Icons.swap_vert_circle_outlined,
),
PageData(
page: const SettingsPage(),
title: 'Settings',
icon: Icons.settings_outlined,
),
];
_initializing = false;
});
}
void _setState(dynamic args) => setState(() {});
@override
Widget build(BuildContext context) {
if (_initializing) {
return const Material(
child: Center(
child: CircularProgressIndicator(
color: StyleConstants.primaryColor,
),
),
);
}
final List<Widget> navRail = [];
if (MediaQuery.of(context).size.width >= Constants.smallScreen) {
navRail.add(_buildNavigationRail());
}
navRail.add(
Expanded(
child: _pageDatas[_selectedIndex].page,
),
);
final walletKit = GetIt.I<IWalletKitService>().walletKit;
return Scaffold(
appBar: AppBar(
title: Text(
_pageDatas[_selectedIndex].title,
style: const TextStyle(color: Colors.black),
),
actions: [
const Text('Relay '),
CircleAvatar(
radius: 6.0,
backgroundColor: walletKit.core.relayClient.isConnected
? Colors.green
: Colors.red,
),
const SizedBox(width: 16.0),
],
),
body: BottomSheetListener(
child: Row(
mainAxisSize: MainAxisSize.max,
children: navRail,
),
),
bottomNavigationBar:
MediaQuery.of(context).size.width < Constants.smallScreen
? _buildBottomNavBar()
: null,
);
}
Widget _buildBottomNavBar() {
return BottomNavigationBar(
currentIndex: _selectedIndex,
unselectedItemColor: Colors.grey,
selectedItemColor: Colors.black,
onTap: (int index) {
setState(() {
_selectedIndex = index;
});
},
items: _pageDatas
.map(
(e) => BottomNavigationBarItem(
icon: Icon(e.icon),
label: e.title,
),
)
.toList(),
);
}
Widget _buildNavigationRail() {
return NavigationRail(
selectedIndex: _selectedIndex,
onDestinationSelected: (int index) {
setState(() {
_selectedIndex = index;
});
},
labelType: NavigationRailLabelType.selected,
destinations: _pageDatas
.map(
(e) => NavigationRailDestination(
icon: Icon(e.icon),
label: Text(e.title),
),
)
.toList(),
);
}
}
关键点解释
- 依赖注入:使用
GetIt
进行依赖注入,确保各个服务实例在整个应用程序生命周期中是单例的。 - 多链支持:通过循环注册不同链的服务实例(如EVM、Kadena、Polkadot、Solana和Cosmos),实现了对多条链的支持。
- 状态管理:通过
setState
方法更新UI状态,确保用户界面与底层数据同步。 - 导航组件:根据屏幕宽度自动切换底部导航栏和侧边栏导航,提升用户体验。
希望这个示例能帮助您更好地理解和使用 reown_walletkit
插件。如果您有任何问题或需要进一步的帮助,请随时联系我!
更多关于Flutter钱包管理插件reown_walletkit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter钱包管理插件reown_walletkit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用reown_walletkit
插件管理钱包的基本示例代码。请注意,reown_walletkit
可能是一个虚构的插件名称,用于说明目的,因为实际中可能不存在这个精确命名的插件。但我会基于通用的Flutter插件使用方法和假设的功能来提供一个示例。
首先,确保你已经在pubspec.yaml
文件中添加了reown_walletkit
依赖(假设它已经存在于pub.dev或者你的私有包仓库中):
dependencies:
flutter:
sdk: flutter
reown_walletkit: ^x.y.z # 替换为实际版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter项目中导入并使用这个插件。以下是一个简单的示例,展示如何初始化钱包、创建钱包、获取钱包地址以及发送交易。
import 'package:flutter/material.dart';
import 'package:reown_walletkit/reown_walletkit.dart'; // 假设插件的导入路径
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late WalletKit walletKit;
String? walletAddress;
@override
void initState() {
super.initState();
// 初始化WalletKit
walletKit = WalletKit();
// 监听钱包状态变化(假设插件提供了这样的功能)
walletKit.onWalletCreated.listen((wallet) {
setState(() {
// 更新UI以显示新创建的钱包地址
walletAddress = wallet.address;
});
});
// 初始化或恢复钱包(假设需要)
// walletKit.initializeWallet();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Wallet Management'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: [
// 创建钱包按钮
ElevatedButton(
onPressed: () async {
try {
// 创建新钱包(假设方法返回Future)
await walletKit.createNewWallet();
} catch (e) {
// 处理错误
print('Error creating wallet: $e');
}
},
child: Text('Create New Wallet'),
),
SizedBox(height: 16),
// 显示钱包地址(如果已创建)
if (walletAddress != null)
Text(
'Wallet Address: $walletAddress',
style: TextStyle(fontSize: 18),
),
SizedBox(height: 16),
// 发送交易按钮(假设需要接收地址和金额)
ElevatedButton(
onPressed: () async {
final String toAddress = 'recipient_address_here'; // 替换为实际接收地址
final double amount = 1.0; // 替换为实际金额
try {
// 发送交易(假设方法返回Future)
await walletKit.sendTransaction(toAddress, amount);
print('Transaction sent successfully');
} catch (e) {
// 处理错误
print('Error sending transaction: $e');
}
},
child: Text('Send Transaction'),
),
],
),
),
),
);
}
}
// 假设的WalletKit类定义(实际中应由插件提供)
class WalletKit {
// 假设的事件流,用于监听钱包创建事件
final StreamController<Wallet> _onWalletCreatedController = StreamController<Wallet>();
Stream<Wallet> get onWalletCreated => _onWalletCreatedController.stream;
// 初始化钱包(可能涉及恢复或创建新钱包)
Future<void> initializeWallet() async {
// 实现初始化逻辑
}
// 创建新钱包
Future<void> createNewWallet() async {
// 实现创建新钱包逻辑
// 创建成功后,通过事件流通知
final newWallet = Wallet(address: 'newly_created_address'); // 替换为实际逻辑
_onWalletCreatedController.add(newWallet);
}
// 发送交易
Future<void> sendTransaction(String toAddress, double amount) async {
// 实现发送交易逻辑
}
}
// 假设的钱包类定义(实际中应由插件提供)
class Wallet {
final String address;
Wallet({required this.address});
}
请注意,上述代码是基于假设的reown_walletkit
插件的功能和API设计的。在实际使用中,你需要参考插件的官方文档来调整代码,以适应插件提供的实际API和功能。特别是事件监听、异步操作、错误处理等方面,可能需要根据插件的具体实现进行调整。