Flutter电商功能插件commerciosdk的使用

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

Flutter电商功能插件Commercio SDK的使用

简介

本仓库包含官方Commercio.network Dart SDK的代码,完全基于Sacco.dart。

主要特性包括:

  • 完全用Dart编写
  • 完全无状态

由于这些特点,你可以在任何纯Dart项目或任何Flutter应用中使用此SDK。

你可以在这里找到官方文档:Commercio SDK 文档

辅助方法

在SDK中,你将找到以下辅助方法,几乎可以帮你完成在Commercio.network区块链上执行的任何操作。

请注意,你可以在SDK文档中找到这些方法的使用示例。我们强烈建议你查看这些文档以获取完整的SDK引用。

加密方法

  • 创建HD钱包
  • 生成AES密钥
  • 生成RSA密钥

文档相关方法

  • 共享文档
  • 发送收据
  • 列出文档
  • 列出收据

身份验证方法

  • 创建Did文档
  • 关联Did文档
  • 请求提升

CommercioMint方法

  • 铸造CCC
  • 烧毁CCC

CommercioKYC方法

  • 邀请用户
  • 购买会员资格
  • 存入奖励池

示例代码

以下是使用Commercio SDK的基本示例代码:

import 'package:sacco/sacco.dart';
import 'package:uuid/uuid.dart';
import 'package:commerciosdk/export.dart';

Future<void> main() async {
  // --------------------------------------------
  // --- 设置网络信息
  // --------------------------------------------

  final lcdUrl = Uri.parse('http://localhost:1337');
  final networkInfo = NetworkInfo(
    bech32Hrp: 'did:com:',
    lcdUrl: lcdUrl,
  );

  // --------------------------------------------
  // --- 创建用于setIdentity的钱包
  // --------------------------------------------

  final mnemonic = Bip39.generateMnemonic(strength: 256).split(' ');
  final wallet = Wallet.derive(mnemonic, networkInfo);

  // --------------------------------------------
  // --- 创建setIdentity交易
  // --------------------------------------------

  // 注意,为了设置身份并进行区块链上的操作,[wallet]需要一些令牌,例如从tumbler或另一个钱包获得。
  //
  // 有关如何发送令牌,请参阅
  // https://docs.commercio.network/developers/create-sign-broadcast-tx.html

  final rsaVerificationKeyPair = await KeysHelper.generateRsaKeyPair(
    keyType: CommercioRSAKeyType.verification,
  );
  final rsaVerificationPubKey = rsaVerificationKeyPair.publicKey;

  final rsaSignatureKeyPair = await KeysHelper.generateRsaKeyPair(
    keyType: CommercioRSAKeyType.signature,
  );
  final rsaSignaturePubKey = rsaSignatureKeyPair.publicKey;

  try {
    final didDocument = await DidDocumentHelper.fromWallet(
      wallet: wallet,
      pubKeys: [rsaVerificationPubKey, rsaSignaturePubKey],
    );
    print('DDO:\n${didDocument.toJson()}');
    print('');

    final response = await IdHelper.setDidDocumentsList(
      [didDocument],
      wallet,
    );

    if (response.success) {
      print('TX 成功发送:\n$lcdUrl/txs/${response.hash}');
      print('----- 你可以从以下URL检索你的did -----');
      print('Endpoint:\n$lcdUrl/identities/${wallet.bech32Address}');
    } else {
      print('TX 错误:\n${response.error?.errorMessage}');
    }
  } catch (error) {
    print('设置DDO时发生错误:\n$error');
  }

  // --------------------------------------------
  // --- 创建用于shareDocument的两个钱包
  // --------------------------------------------

  final senderMnemonic = Bip39.generateMnemonic(strength: 256).split(' ');
  final senderWallet = Wallet.derive(senderMnemonic, networkInfo);

  final recipientMnemonic = Bip39.generateMnemonic(strength: 256).split(' ');
  final recipientWallet = Wallet.derive(recipientMnemonic, networkInfo);

  // --------------------------------------------
  // --- 创建一个shareDocument交易
  // --------------------------------------------

  final docRecipientDid = recipientWallet.bech32Address;
  final docId = const Uuid().v4();

  final checksum = CommercioDocChecksum(
    value: 'a00ab326fc8a3dd93ec84f7e7773ac2499b381c4833e53110107f21c3b90509c',
    algorithm: CommercioDocChecksumAlgorithm.SHA256,
  );

  // 注意,为了使[senderWallet]共享的文档进行DoSign,[recipientWallet]必须在区块链上有身份。
  //
  // 设置身份的步骤描述在“创建setIdentity交易”部分。
  //
  // 有关详细信息,请参阅
  // https://docs.commercio.network/x/id/tx/create-an-identity.html

  final doSign = CommercioDoSign(
    storageUri: 'http://www.commercio.network',
    signerIstance: 'did:com:1cc65t29yuwuc32ep2h9uqhnwrregfq230lf2rj',
    sdnData: const {
      CommercioSdnData.COMMON_NAME,
      CommercioSdnData.SURNAME,
    },
    vcrId: 'xxxxx',
    certificateProfile: 'xxxxx',
  );

  try {
    final commercioDoc = await CommercioDocHelper.fromWallet(
      wallet: senderWallet,
      recipients: [docRecipientDid],
      id: docId,
      metadata: CommercioDocMetadata(
        contentUri: 'https://example.com/document/metadata',
        schema: CommercioDocMetadataSchema(
          uri: 'https://example.com/custom/metadata/schema',
          version: '7.0.0',
        ),
      ),
      contentUri: 'https://example.com/document',
      checksum: checksum,
      doSign: doSign,
      encryptedData: {CommercioEncryptedData.CONTENT_URI},
    );
    final response = await DocsHelper.shareDocumentsList(
      [commercioDoc],
      senderWallet,
    );

    if (response.success) {
      print('TX 成功发送:\n$lcdUrl/txs/${response.hash}');
      print('----- 你可以从以下URL检索你的发送的文档 -----');
      print('Endpoint:\n$lcdUrl/docs/${senderWallet.bech32Address}/sent');
    } else {
      print('TX 错误:\n${response.error?.errorMessage}');
    }
  } catch (error) {
    print('共享文档时发生错误:\n$error');
  }
}

更多关于Flutter电商功能插件commerciosdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter电商功能插件commerciosdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用commerciosdk插件来实现基本电商功能的代码案例。commerciosdk是一个用于构建电商应用的Flutter插件,它提供了一系列功能来简化商品管理、购物车、订单处理等流程。

首先,确保你已经在pubspec.yaml文件中添加了commerciosdk依赖:

dependencies:
  flutter:
    sdk: flutter
  commerciosdk: ^最新版本号 # 替换为最新的版本号

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

初始化CommercioSDK

在你的主应用文件(通常是main.dart)中,你需要初始化CommercioSDK。这里是一个基本的初始化示例:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 CommercioSDK
  final commercioSdk = CommercioSdk(
    networkInfo: NetworkInfo(
      bech32Prefix: {
        'acc': 'commercio',
        'val': 'commerciovaloper',
        'cons': 'commerciocons',
      },
      lcdUrl: 'https://lcd.commercio.network',
      // 根据你的网络配置修改以上URL
    ),
    wallet: Wallet(
      mnemonic: 'your_mnemonic_here', // 使用你的助记词
    ),
  );

  // 设置全局的 commercioSdk 实例(可选,但方便全局访问)
  // 你也可以通过依赖注入等方式管理这个实例
  runApp(MyApp(commercioSdk: commercioSdk));
}

class MyApp extends StatelessWidget {
  final CommercioSdk commercioSdk;

  MyApp({required this.commercioSdk});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Commerce App',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(commercioSdk: commercioSdk),
    );
  }
}

商品列表

接下来,你可以创建一个商品列表页面。这里是一个简单的示例,展示如何从服务器获取商品列表并显示:

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

class MyHomePage extends StatefulWidget {
  final CommercioSdk commercioSdk;

  MyHomePage({required this.commercioSdk});

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<CommercioDoc> products = [];

  @override
  void initState() {
    super.initState();
    _fetchProducts();
  }

  Future<void> _fetchProducts() async {
    try {
      // 假设你有一个商品集合的ID
      final String collectionId = 'your_collection_id_here';
      final items = await widget.commercioSdk.docs.queryDocuments(
        collectionId: collectionId,
      );
      setState(() {
        products = items;
      });
    } catch (e) {
      print('Error fetching products: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Product List'),
      ),
      body: ListView.builder(
        itemCount: products.length,
        itemBuilder: (context, index) {
          final product = products[index];
          return ListTile(
            title: Text(product.title ?? 'No Title'),
            subtitle: Text(product.content ?? 'No Description'),
          );
        },
      ),
    );
  }
}

添加到购物车

为了实现添加到购物车的功能,你需要管理一个购物车的状态。这里是一个简单的购物车管理示例:

class Cart with ChangeNotifier {
  Map<String, int> _items = {};

  void addItem(String id, int quantity) {
    _items[id] = (_items[id] ?? 0) + quantity;
    notifyListeners();
  }

  void removeItem(String id) {
    _items.remove(id);
    notifyListeners();
  }

  Map<String, int> get items {
    return {..._items};
  }
}

在你的MyHomePage中,你可以添加一个按钮来将商品添加到购物车:

class _MyHomePageState extends State<MyHomePage> with ProviderListenerMixin<Cart> {
  // ... 之前的代码 ...

  @override
  Widget build(BuildContext context) {
    final cart = Provider.of<Cart>(context);

    return Scaffold(
      appBar: AppBar(
        title: Text('Product List'),
      ),
      body: ListView.builder(
        itemCount: products.length,
        itemBuilder: (context, index) {
          final product = products[index];
          return ListTile(
            title: Text(product.title ?? 'No Title'),
            subtitle: Text(product.content ?? 'No Description'),
            trailing: IconButton(
              icon: Icon(Icons.add_shopping_cart),
              onPressed: () {
                cart.addItem(product.id, 1);
              },
            ),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => CartPage(cart: cart)),
          );
        },
        tooltip: 'Go to Cart',
        child: Icon(Icons.shopping_cart),
      ),
    );
  }
}

购物车页面

最后,创建一个购物车页面来显示购物车中的商品:

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

class CartPage extends StatelessWidget {
  final Cart cart;

  CartPage({required this.cart});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Shopping Cart'),
      ),
      body: Consumer<Cart>(
        builder: (context, cart, child) {
          final items = cart.items;
          return ListView.builder(
            itemCount: items.length,
            itemBuilder: (context, index) {
              final itemId = items.keys.toList()[index];
              final quantity = items[itemId]!;
              // 这里你需要根据 itemId 获取商品详情
              // 假设你有一个函数 `getProductById(String id)` 返回商品详情
              final product = getProductById(itemId); // 实现这个函数
              return ListTile(
                title: Text(product.title ?? 'No Title'),
                trailing: Text('$quantity'),
              );
            },
          );
        },
      ),
    );
  }

  // 这是一个假设的函数,你需要根据实际情况实现它
  CommercioDoc getProductById(String id) {
    // 根据你的数据源返回对应的商品详情
    return CommercioDoc(); // 返回一个模拟的商品对象
  }
}

请注意,上面的代码是一个简化的示例,并没有处理所有可能的错误和边界情况。在实际应用中,你需要添加更多的错误处理、UI优化和功能。此外,commerciosdk插件的具体用法可能会随着版本的更新而变化,因此请参考最新的官方文档来获取最准确的信息。

回到顶部