Flutter集成Peppermint服务插件peppermint_sdk的使用

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

Flutter集成Peppermint服务插件peppermint_sdk的使用

本README描述了该插件。如果你将此插件发布到pub.dev,则此README的内容将出现在你的插件页面上。

功能简介

此Flutter库旨在轻松使用Peppermint功能。

Web3钱包最常见的用途是生成钱包地址(公钥)和私钥。Peppermint SDK简化了这一过程,无需手动实现其他复杂的web3包。此插件还通过flutter_secure_storage安全地存储密钥。

未来,此插件将成为一个桥梁,以更简单的方式使用Peppermint的功能。

特性

  1. 生成钱包地址(公钥)和私钥
  2. 获取当前钱包地址
  3. 获取当前私钥
  4. 生成随机合约名称
  5. 绑定现有或新钱包
  6. 删除钱包
  7. 从设备中选择媒体文件
  8. 从相机获取图像
  9. 打开URL
  10. 从相机扫描二维码
  11. 图像编辑器

如何安装

Android

  1. AndroidManifest.xml中添加UCropActivity
<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:screenOrientation="portrait"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

注意: 自v1.2.0版本起,你需要将Android项目迁移到v2嵌入(详情见这里)。

iOS

无需任何配置。

使用方法

导入package:peppermint_sdk/peppermint_sdk.dart,实例化WalletManager

你可以在peppermint-flutter-sdk/example/lib/wallet_page.dart中的WalletPage类中查看完整的示例。

钱包功能

import 'package:peppermint_sdk/peppermint_sdk.dart';

WalletManager manager = WalletManager();

// 生成新的钱包
WalletKeys keys = manager.createWallet();
print('${keys.publicKey}');
print('${keys.privateKey}');

// 生成带有指定key的新钱包
WalletKeys keys = manager.createWallet(key: "wallet1");

// 从现有私钥生成钱包
String walletAddress = await manager.restoreWallet('enter your private key here');

// 获取当前钱包地址
String publicKey = await manager.getPublicKey();

// 获取当前私钥
String privateKey = await manager.getPrivateKey();

// 删除所有钱包
await deleteAllWallet();

// 检查是否有任何钱包
bool hasWallet = await manager.hasAnyWallet();

// 生成合约名称
String contractName = PeppermintUtility.generateContractName();

此库能够管理每个设备上的多个私钥和公钥。

你可以在peppermint-flutter-sdk/example/lib/utilities_page.dart中的UtilitiesPage类中查看完整的示例。

工具功能

import 'package:peppermint_sdk/peppermint_sdk.dart';

// 从相机上传图片。
// 可以设置edit为false或true来应用编辑器
File? file = await PeppermintUtility.getImageFromCamera(edit: true);

// 从相册上传图片。
// 可以设置squareCrop为false或true来应用方形裁剪
File? file = await PeppermintUtility.getImageFromGallery(squareCrop: true);

// 从文件浏览器上传媒体文件。
// 可以设置edit为false或true来应用方形裁剪
File? file = await PeppermintUtility.getMediaFromExplorer(squareCrop: true);

// 从相册上传视频。
File? file = await PeppermintUtility.getVideoFromGallery();

你可以在peppermint-flutter-sdk/example/lib/wallet_connect_page.dart中的WalletConnectPage类中查看完整的示例。

钱包连接功能

import 'package:peppermint_sdk/peppermint_sdk.dart';

WCAttributes attributes = await WalletConnectManager().initWalletConnect(
    maticRpcUri: maticRpcUri, // 区块链服务提供商要使用的RPC URI。
    onDisconnect: (code, reason) {
      // 响应断开连接回调
    },
    onFailure: (error) {
      // 响应连接失败回调
    },
    onSessionRequest: (id, peerMeta) {
      // 响应连接请求回调
    },
    onEthSign: (id, message) {
      // 响应personal_sign或eth_sign或eth_signTypedData请求回调
    },
    onEthSendTransaction: (id, tx) {
      // 响应eth_sendTransaction请求回调
    },
    onEthSignTransaction: (id, tx) {
      // 响应eth_signTransaction请求回调
    },
);

// 从wc: URI创建WCSession对象。
// 创建WCPeerMeta对象,包含你的应用元数据。
// 连接到新会话。
attributes = WalletConnectManager().connectNewSession(result, attributes);

// 确认会话连接请求。
attributes = _wcManager.approveSession(
    attributes: attributes,
    chainId: 5,
    rpcNetwork: 'https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161',
    walletAddress: walletAddress,
);

// 确认签名请求
attributes = await _wcManager.confirmSign(
    attributes: attributes,
    id: id,
    ethereumSignMessage: ethereumSignMessage,
    privateKey: walletAddress,
);

// 确认签名交易请求
attributes = await _wcManager.confirmSignTransaction(
    attributes: attributes,
    id: id,
    ethereumTransaction: ethereumTransaction,
    privateKey: walletAddress,
);

// 确认发送交易请求
attributes = await _wcManager.confirmSendTransaction(
    attributes: attributes,
    id: id,
    ethereumTransaction: ethereumTransaction,
    privateKey: walletAddress,
);

// 获取Gas价格
BigInt gasPrice = await _wcManager.getGasPrice(
    attributes: attributes,
    ethereumTransaction: ethereumTransaction,
);

// 拒绝会话连接请求。
attributes.wcClient.rejectSession();

// 通过指定请求ID拒绝任何上述请求
attributes.wcClient.rejectRequest(id: id);

// 永久关闭已连接的会话
attributes.wcClient.killSession();

Peppermint SDK 功能性

此SDK还提供了一些全局功能(用例),使项目更容易使用基本的Peppermint功能,如’ExchangeCode’、‘GetNftList’、'TokenDetail’等。更多详细信息可以在lib/src/peppermint_functionalities/nft/usecases路径下的’uases’文件夹中找到。

如何使用

  1. 在使用功能之前,你需要在项目中注入用例:
import 'package:peppermint_sdk/peppermint_sdk.dart';

  Get.lazyPut<NftRepo>(
      () => NftRepo(
        walletClient: Get.put(WalletClient()),
        errorHandler: ErrorHandlers(
            wrong: 'Something went wrong',
            forbidden: 'Forbidden request',
            doesntExist: 'Page does not exist',
            underMaintenance: 'Feature is under maintenance'),
      ),
    );
  Get.lazyPut(() => GetNftListUseCase(Get.find()));
  Get.lazyPut(() => TokenDetailUsecase(Get.find()));
  Get.lazyPut(() => ExchangeCodeUseCase(Get.find()));

注意,上面的注入示例使用了Get包,你可以使用自己的依赖注入工具,如injectable、get_it。更多关于此包的信息可以在此处找到。

  1. 使用功能

你可以在项目的控制器类或业务逻辑类中使用以下功能:

import 'package:peppermint_sdk/peppermint_sdk.dart';

// 通过Peppermint SDK从仓库获取数据。
final resource = await _tokenDetailUsecase.invoke(
  id: id,
);

// 在资源返回成功或失败后确定下一步。
// 下面的onSuccess将返回定义类模型的用例。
// 更多关于此用例示例的详细信息可以在这个路径中找到:
// lib/src/peppermint_functionalities/nft/usecases/token_detail_usecase.dart
resource.when(onSuccess: (onSuccess) {
  detailData = onSuccess;
    Get.toNamed(
      Routes.nftViewDetail,
    );
  }, onFailure: (onFailure) {
    Popup.error(onFailure);
    return;
  });

你可以在example/lib/demo_features/nft/nft_controller.dart文件中找到更多关于此功能的详细信息。

示例代码

import 'package:example/demo_features/nft/nft_binding.dart';
import 'package:example/demo_features/nft/nft_detail_page.dart';
import 'package:example/demo_features/nft/nft_list_view.dart';
import 'package:example/demo_utilities/utilities_page.dart';
import 'package:example/wallet_connect_page.dart';
import 'package:example/demo_utilities/wallet_page.dart';
import 'package:example/routes.dart';
import 'package:example/widget/button.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  [@override](/user/override)
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'Peppermint SDK Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      getPages: [
        GetPage(
          name: Routes.main,
          page: () => const CreateWalletPage(),
        ),
        GetPage(
          name: Routes.utilities,
          page: () => const UtilitiesPage(),
        ),
        GetPage(
          name: Routes.widgets,
          page: () => const WalletPage(),
        ),
        GetPage(
          name: Routes.nftView,
          page: () => const NftViewList(),
          binding: NftBinding(),
        ),
        GetPage(
          name: Routes.nftViewDetail,
          page: () => const NftDetailPage(),
        ),
      ],
    );
  }
}

/// This page is a first page of the example appp.
class CreateWalletPage extends StatefulWidget {
  const CreateWalletPage({Key? key}) : super(key: key);

  [@override](/user/override)
  State<CreateWalletPage> createState() => _CreateWalletPageState();
}

class _CreateWalletPageState extends State<CreateWalletPage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Example App'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            MyButton(
                text: 'Utility Example Page',
                onTap: () {
                  Get.toNamed(Routes.utilities);
                }),
            const SizedBox(height: 16.0),
            MyButton(
                text: 'Wallet Example Page',
                onTap: () {
                  Get.toNamed(Routes.widgets);
                }),
            const SizedBox(height: 16.0),
            MyButton(
                text: 'Chatbot Example Page',
                onTap: () {
                  Get.toNamed(Routes.chatbot);
                }),
            const SizedBox(height: 16.0),
            MyButton(
                text: 'Nft View Example Page',
                onTap: () {
                  Get.toNamed(Routes.nftView);
                }),
            const SizedBox(height: 16.0),
            MyButton(
                text: 'Wallet Connect Example Page',
                onTap: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => const WalletConnectPage()));
                }),
            const SizedBox(height: 16.0),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter集成Peppermint服务插件peppermint_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Peppermint服务插件peppermint_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中集成并使用Peppermint服务插件peppermint_sdk,你可以按照以下步骤进行操作。以下是一个简要的指南和代码示例,帮助你快速上手。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  peppermint_sdk: ^最新版本号  # 请替换为实际的最新版本号

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

2. 配置iOS和Android

确保你已经在iOS和Android项目中配置了必要的权限和网络设置,以便peppermint_sdk能够正常工作。这通常包括在Info.plistAndroidManifest.xml中添加必要的权限声明。

iOS配置(Info.plist)

根据需要添加网络权限等配置。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Android配置(AndroidManifest.xml)

同样,根据需要添加网络权限等配置。

<uses-permission android:name="android.permission.INTERNET"/>

3. 初始化和使用Peppermint SDK

在你的Flutter项目中,导入peppermint_sdk包并进行初始化。以下是一个简单的代码示例:

import 'package:flutter/material.dart';
import 'package:peppermint_sdk/peppermint_sdk.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late PeppermintClient peppermintClient;

  @override
  void initState() {
    super.initState();
    // 初始化Peppermint SDK
    peppermintClient = PeppermintClient(
      apiKey: '你的API密钥',  // 替换为你的实际API密钥
      endpoint: 'https://你的API端点',  // 替换为你的实际API端点
    );

    // 示例:调用某个API
    _fetchData();
  }

  Future<void> _fetchData() async {
    try {
      // 假设有一个获取用户信息的API
      var response = await peppermintClient.get('/user/info');
      print('User Info: ${response.body}');
    } catch (e) {
      print('Error fetching data: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Peppermint SDK Demo'),
        ),
        body: Center(
          child: Text('Check the console for user info.'),
        ),
      ),
    );
  }
}

4. 处理响应和错误

在上面的示例中,我们简单地打印了响应和错误。在实际应用中,你可能需要根据响应结果更新UI或处理错误情况。

注意事项

  1. API密钥和端点:确保你使用的是正确的API密钥和端点。
  2. 错误处理:在生产环境中,添加更详细的错误处理和用户反馈机制。
  3. 安全性:不要在客户端代码中硬编码敏感信息,考虑使用环境变量或安全存储机制。

通过以上步骤,你应该能够在Flutter项目中成功集成并使用peppermint_sdk插件。如果有更多特定功能需求,请参考peppermint_sdk的官方文档以获取更多详细信息和示例代码。

回到顶部