Flutter Solana钱包管理插件solana_mobile_wallet的使用

Flutter Solana钱包管理插件solana_mobile_wallet的使用

本文将详细介绍如何在Flutter项目中使用solana_mobile_wallet插件来管理Solana钱包。该插件实现了Mobile Wallet Adapter规范,支持与Solana钱包进行交互。

使用步骤

1. 添加依赖

首先,在pubspec.yaml文件中添加solana_mobile_wallet依赖:

dependencies:
  solana_mobile_wallet: ^0.1.0

然后运行以下命令以更新依赖项:

flutter pub get

2. 初始化钱包

在应用启动时,初始化钱包并生成或加载私钥。以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:solana/base58.dart';
import 'package:solana/solana.dart';
import 'package:solana_mobile_wallet_example/mobile_wallet/bloc.dart';
import 'package:solana_mobile_wallet_example/screens/auth_screen.dart';
import 'package:solana_mobile_wallet_example/screens/send_transactions_screen.dart';
import 'package:solana_mobile_wallet_example/screens/sign_payloads_screen.dart';
import 'package:solana_mobile_wallet_example/screens/sign_transactions_for_sending.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 加载SharedPreferences实例
  final prefs = await SharedPreferences.getInstance();
  final key = prefs.getString('key');

  // 初始化钱包
  final Ed25519HDKeyPair pair;
  if (key == null) {
    // 如果没有私钥,则随机生成一个
    pair = await Ed25519HDKeyPair.random();
    final privateKey = await pair.extract().then((value) => value.bytes).then(base58encode);
    await prefs.setString('key', privateKey); // 将私钥保存到SharedPreferences
  } else {
    // 如果有私钥,则从SharedPreferences中加载
    final privateKey = base58decode(key);
    pair = await Ed25519HDKeyPair.fromPrivateKeyBytes(privateKey: privateKey);
  }

  // 启动应用
  runApp(
    BlocProvider(
      create: (_) => MobileWalletBloc(pair), // 创建钱包块
      child: const MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: BlocConsumer<MobileWalletBloc, MobileWalletState>(
          listener: (context, state) => state.whenOrNull(
            sessionTerminated: SystemNavigator.pop, // 会话终止时退出应用
          ),
          builder: (context, state) => state.when(
            none: () => const Center(
              child: Text('Running...'), // 默认显示运行中
            ),
            sessionTerminated: () => const Center(
              child: Text('Running...'), // 会话终止时显示
            ),
            remote: (r) => r.map(
              authorizeDapp: (r) => AuthScreen(request: r.request), // 授权DApp
              signPayloads: (r) => SignPayloadsScreen(request: r.request), // 签署数据
              signTransactionsForSending: (r) =>
                  SignTransactionsForSendingScreen(request: r.request), // 签署交易
              sendTransactions: (r) => SendTransactionsScreen(request: r), // 发送交易
            ),
          ),
        ),
      ),
    );
  }
}

3. 实现屏幕组件

接下来,我们需要实现各个屏幕组件,例如授权屏幕、签署数据屏幕等。以下是部分示例代码:

授权屏幕 (AuthScreen)

class AuthScreen extends StatefulWidget {
  final AuthorizeRequest request;

  const AuthScreen({super.key, required this.request});

  [@override](/user/override)
  _AuthScreenState createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Authorize DApp'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 授权DApp
            context.read<MobileWalletBloc>().add(AuthorizeDApp(widget.request));
          },
          child: Text('Authorize'),
        ),
      ),
    );
  }
}

签署数据屏幕 (SignPayloadsScreen)

class SignPayloadsScreen extends StatefulWidget {
  final SignPayloadsRequest request;

  const SignPayloadsScreen({super.key, required this.request});

  [@override](/user/override)
  _SignPayloadsScreenState createState() => _SignPayloadsScreenState();
}

class _SignPayloadsScreenState extends State<SignPayloadsScreen> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sign Payloads'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 签署数据
            context.read<MobileWalletBloc>().add(SignPayloads(widget.request));
          },
          child: Text('Sign Payloads'),
        ),
      ),
    );
  }
}

更多关于Flutter Solana钱包管理插件solana_mobile_wallet的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Solana钱包管理插件solana_mobile_wallet的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


solana_mobile_wallet 是一个用于在 Flutter 应用中与 Solana 移动钱包进行交互的插件。它允许开发者通过移动钱包应用(如 Phantom 或 Solflare)进行身份验证、签名交易等操作。以下是如何在 Flutter 项目中使用 solana_mobile_wallet 插件的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 solana_mobile_wallet 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  solana_mobile_wallet: ^0.1.0  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化插件

在你的 Dart 代码中,导入 solana_mobile_wallet 插件并初始化它:

import 'package:solana_mobile_wallet/solana_mobile_wallet.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Solana Mobile Wallet Example'),
        ),
        body: WalletScreen(),
      ),
    );
  }
}

class WalletScreen extends StatefulWidget {
  [@override](/user/override)
  _WalletScreenState createState() => _WalletScreenState();
}

class _WalletScreenState extends State<WalletScreen> {
  final SolanaMobileWallet _wallet = SolanaMobileWallet();

  [@override](/user/override)
  void initState() {
    super.initState();
    _initializeWallet();
  }

  Future<void> _initializeWallet() async {
    try {
      await _wallet.initialize();
      print('Wallet initialized');
    } catch (e) {
      print('Failed to initialize wallet: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: _connectWallet,
            child: Text('Connect Wallet'),
          ),
          ElevatedButton(
            onPressed: _signTransaction,
            child: Text('Sign Transaction'),
          ),
        ],
      ),
    );
  }

  Future<void> _connectWallet() async {
    try {
      final publicKey = await _wallet.connect();
      print('Connected with public key: $publicKey');
    } catch (e) {
      print('Failed to connect wallet: $e');
    }
  }

  Future<void> _signTransaction() async {
    try {
      final transaction = '...'; // 你的交易数据
      final signedTransaction = await _wallet.signTransaction(transaction);
      print('Signed transaction: $signedTransaction');
    } catch (e) {
      print('Failed to sign transaction: $e');
    }
  }
}
回到顶部