Flutter钱包管理插件reown_walletkit的使用

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

Flutter钱包管理插件reown_walletkit的使用

Reown - WalletKit Flutter

Reown Logo WalletKit Logo

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

1 回复

更多关于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和功能。特别是事件监听、异步操作、错误处理等方面,可能需要根据插件的具体实现进行调整。

回到顶部