Flutter UI组件插件sui的使用

Flutter UI组件插件sui的使用

Sui Dart SDK

Pub

注意: 此分支正在积极开发中,并可能引入破坏性更改。如果您不需要 Transaction v2 功能,请使用 v1 分支。

安装

dependencies:
  sui: ^0.3.7

示例

查看完整的示例代码可以在以下链接找到:

example/lib/main.dart

使用

连接到Sui网络

/// 连接到开发网络
final devnetClient = SuiClient(SuiUrls.devnet);

/// 连接到测试网络
final testnetClient = SuiClient(SuiUrls.testnet);

/// 连接到主网络
final mainnetClient = SuiClient(SuiUrls.mainnet);

获取测试网币

Faucet V0

final faucet = FaucetClient(SuiUrls.faucetDev);
await faucet.requestSuiFromFaucetV0('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

Faucet V1

final faucet = FaucetClient(SuiUrls.faucetDev);
await faucet.requestSuiFromFaucetV1('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

创建Sui账户

使用私钥创建账户

/// Ed25519账户
final ed25519 = SuiAccount.ed25519Account();
final ed25519Import = SuiAccount.fromPrivateKey(ed25519.privateKey());

/// Secp256k1账户
final secp256k1 = SuiAccount.secp256k1Account();
final sepc256k1Import = SuiAccount.fromPrivateKey(secp256k1.privateKey());

/// Secp256r1账户
final secp256r1 = SuiAccount.secp256r1Account();
final sepc256r1Import = SuiAccount.fromPrivateKey(secp256r1.privateKey());

使用助记词创建账户

/// 创建助记词
final mnemonics = SuiAccount.generateMnemonic();

/// Ed25519账户
final ed25519 = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);

/// Secp256k1账户
final secp256k1 = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Secp256k1);

/// Secp256r1账户
final secp256r1 = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Secp256r1);

写API

转移对象

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

final tx = Transaction();
tx.transferObjects(
    [tx.objectId('0x2619f581cb1864d07c89453a69611202669fdc4784fb59b9cb4278ec60756011')], 
    account.getAddress()
);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

拆分并转移硬币

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

final tx = Transaction();
final coin = tx.splitCoins(tx.gas, [1000]);
tx.transferObjects(
    [coin],
    account.getAddress()
);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

合并硬币

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

final tx = Transaction();
tx.mergeCoins(tx.objectId('0x922ec73939b3288f6da39ebefb0cb88c6c54817441254d448bd2491ac4dd0cbd'), 
    [tx.objectId('0x8dafc96dec7f8d635e052a6da9a4153e37bc4d59ed44c45006e4e9d17d07f80d')]
);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

执行Move调用

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

const packageObjectId = '0x...';
final tx = Transaction();
tx.moveCall('$packageObjectId::nft::mint', arguments: [tx.pureString('Example NFT')]);

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

发布模块

final account = SuiAccount.fromMnemonics(mnemonics, SignatureScheme.Ed25519);
final client = SuiClient(SuiUrls.devnet);

const modules = [];
const dependencies = [];
final tx = Transaction();
final upgradeCap = tx.publish(modules, dependencies);
tx.transferObjects([upgradeCap], account.getAddress());

final result = await client.signAndExecuteTransactionBlock(account, tx);
print(result.digest);

读API

获取拥有的对象

final client = SuiClient(SuiUrls.devnet);

final objects = await client.getOwnedObjects('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

获取对象

final client = SuiClient(SuiUrls.devnet);

final obj = await client.getObject('0x0d49dbda185cd0941b71315edb594276731f21b2232d8713f319b02c462a2da7',
    options: SuiObjectDataOptions(showContent: true)
);

final objs = await client.multiGetObjects([
    '0x0d49dbda185cd0941b71315edb594276731f21b2232d8713f319b02c462a2da7',
    '0x922ec73939b3288f6da39ebefb0cb88c6c54817441254d448bd2491ac4dd0cbd'
], options: SuiObjectDataOptions(showType: true));

获取交易

final client = SuiClient(SuiUrls.devnet);

final txn = await client.getTransactionBlock('6oH779AUs2WpwW77xCVGbYqK1FYVamRqHjV6A5wCV8Qj',
    options: SuiTransactionBlockResponseOptions(showEffects: true)
);

final txns = await client.multiGetTransactionBlocks([
    '9znMGToLRRa8yZvjCUfj1FJmq4gpb8QwpibFAUffuto1',
    '4CEFMajEtM62MthwY1xR3Bcddoh2h5wc7jeKEy7WWsbv'
], options: SuiTransactionBlockResponseOptions(showInput: true, showEffects: true));

获取检查点

final client = SuiClient(SuiUrls.devnet);

final checkpoint = await client.getCheckpoint('338000');

final checkpoints = await client.getCheckpoints(descendingOrder: true);

获取硬币

final client = SuiClient(SuiUrls.devnet);

final coins = await client.getCoins(
    '0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2',
    coinType: '0x2::sui::SUI');

final allCoins = await client.getAllCoins('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

final suiBalance = await client.getBalance('0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2');

事件API

查询事件

final client = SuiClient(SuiUrls.devnet);

final events = await client.queryEvents(
    {"Sender": "0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2"}, 
    limit: 2
);

/// 或者使用 EventFilter

final events = await client.queryEventsByFilter(
    EventFilter(sender: "0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2"), 
    limit: 2
);

WebSocket客户端订阅事件

final client = WebsocketClient(SuiUrls.webSocketDevnet);

final subscription = client.subscribeEvent({"Sender": "0xa2d8bb82df40770ac5bc8628d8070b041a13386fef17db27b32f3b0f316ae5a2"})
.listen((event) {
    debugPrint(event);
}, onError: (e) {
    debugPrint(e.toString());
});

示例代码

import 'package:example/pages/faucet.dart';
import 'package:example/pages/home.dart';
import 'package:example/pages/merge.dart';
import 'package:example/pages/share_example.dart';
import 'package:example/pages/split_page.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:focus_detector_v2/focus_detector_v2.dart';
import 'package:sui/sui.dart';

import 'helper/helper.dart';
import 'pages/token_menu.dart';
import 'pages/transfer.dart';

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sui Dart Demo',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        primarySwatch: Colors.blue,
        textSelectionTheme: const TextSelectionThemeData(
          cursorColor: Color.fromRGBO(84, 150, 229, 1),
          selectionColor: Colors.yellow,
          selectionHandleColor: Colors.black,
        ),
      ),
      home: const MyHomePage(title: 'Sui Dart Demo'),
      builder: FToastBuilder(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  SuiAccount? account;

  String localNetwork = "devnet";

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

    getLocalSuiAccount().then((value) {
      setState(() {
        account = value;
      });
    });
  }

  void _navigateToTokenManage() {
    Navigator.of(context).push(
        MaterialPageRoute(builder: (context) => TokenMenu(client: suiClient)));
  }

  int menuIndex = 0;

  Widget contentPage(int menuIndex) {
    if (account == null) return Container();

    final acc = account!;
    switch (menuIndex) {
      case 0:
        return const Home();
      case 1:
        return Faucet(acc);
      case 2:
        return SplitPage(acc);
      case 3:
        return Merge(acc);
      case 4:
        return Transfer(acc);
    }

    return Container();
  }

  void menuClick(int menu) {
    setState(() {
      menuIndex = menu;
    });
  }

  void switchNet(String network) {
    switch (network) {
      case "devnet":
        suiClient = SuiClient(SuiUrls.devnet);
        localNetwork = "devnet";
        break;
      case "testnet":
        suiClient = SuiClient(SuiUrls.testnet);
        localNetwork = "testnet";
        break;
      case "mainnet":
        suiClient = SuiClient(SuiUrls.mainnet);
        localNetwork = "mainnet";
        break;
    }

    menuClick(0);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return FocusDetector(
        onFocusGained: () {
          // _requestFaucet();
        },
        child: Scaffold(
          appBar: AppBar(title: Text(widget.title), actions: [
            MenuAnchor(
                builder: (context, controller, child) {
                  return CupertinoButton(
                      onPressed: () {
                        if (controller.isOpen) {
                          controller.close();
                        } else {
                          controller.open();
                        }
                      },
                      child: Text(localNetwork,
                          style: const TextStyle(color: Colors.white)));
                },
                menuChildren: [
                  MenuItemButton(
                      child: const SizedBox(
                          width: 80,
                          child: Text("devnet", textAlign: TextAlign.center)),
                      onPressed: () {
                        switchNet("devnet");
                      }),
                  MenuItemButton(
                      child: const SizedBox(
                          width: 80,
                          child: Text("testnet", textAlign: TextAlign.center)),
                      onPressed: () {
                        switchNet("testnet");
                      }),
                  MenuItemButton(
                      child: const SizedBox(
                          width: 80,
                          child: Text("mainnet", textAlign: TextAlign.center)),
                      onPressed: () {
                        switchNet("mainnet");
                      }),
                ]),
          ]),
          drawer: Drawer(
            child: ListView(
              children: [
                DrawerHeader(
                    decoration: const BoxDecoration(
                        color: Color.fromRGBO(84, 150, 229, 1)),
                    child: Center(
                      child: Column(
                        children: [
                          const Text("Sui Dart",
                              style:
                                  TextStyle(fontSize: 20, color: Colors.white)),
                          const SizedBox(height: 30),
                          if (account != null)
                            SelectableText(
                              account!.getAddress(),
                              showCursor: true,
                              style: const TextStyle(
                                  fontSize: 14, color: Colors.white),
                              onTap: () {
                                print(account!.getAddress());
                              },
                            ),
                        ],
                      ),
                    )),
                ListTile(
                  title: const Text("Home"),
                  onTap: () {
                    Navigator.pop(context);
                    menuClick(0);
                  },
                ),
                ListTile(
                  title: const Text("Faucet"),
                  onTap: () {
                    Navigator.pop(context);
                    menuClick(1);
                  },
                ),
                ListTile(
                  title: const Text("Split SUI"),
                  onTap: () {
                    Navigator.pop(context);
                    menuClick(2);
                  },
                ),
                ListTile(
                  title: const Text(("Merge Sui")),
                  onTap: () {
                    Navigator.pop(context);
                    menuClick(3);
                  },
                ),
                ListTile(
                  title: const Text(("Transfer Sui")),
                  onTap: () {
                    Navigator.pop(context);
                    menuClick(4);
                  },
                ),
                ListTile(
                  title: const Text(("Share example")),
                  onTap: () {
                    Navigator.pop(context);
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) => ShareDemo(),
                      ),
                    );
                  },
                ),
                // ListTile(
                //   title: const Text(("Publish Package")),
                //   onTap: () {
                //     print("tap Publish...");
                //   },
                // )
              ],
            ),
          ),
          body: Center(child: contentPage(menuIndex)),
        ));
  }
}

更多关于Flutter UI组件插件sui的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


在Flutter中,使用第三方UI组件插件可以极大地加速开发过程,并提供丰富的功能和美观的界面。尽管没有一个名为sui的官方或广泛认可的Flutter UI组件插件(可能是指某种特定团队或个人的插件),但我们可以讨论如何使用一般的Flutter UI组件插件,并提供一个示例,假设有一个类似的插件存在。

假设的sui插件使用示例

首先,确保你的Flutter环境已经设置好,并且你已经创建了一个新的Flutter项目。

  1. 添加依赖

    在你的pubspec.yaml文件中添加对sui插件的依赖(注意:这里sui是假设的,实际使用时请替换为真实插件的名称和版本)。

    dependencies:
      flutter:
        sdk: flutter
      sui: ^x.y.z  # 替换为实际版本号
    

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

  2. 导入插件

    在你需要使用sui插件的Dart文件中导入它。

    import 'package:sui/sui.dart';
    
  3. 使用插件提供的组件

    假设sui插件提供了一个名为SuiButton的按钮组件,你可以这样使用它:

    import 'package:flutter/material.dart';
    import 'package:sui/sui.dart';  // 导入sui插件
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Sui Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Sui Button Demo'),
          ),
          body: Center(
            child: SuiButton(
              label: 'Click Me',
              onPressed: () {
                // 按钮点击事件处理
                print('SuiButton clicked!');
              },
            ),
          ),
        );
      }
    }
    

    在这个示例中,SuiButton是一个假设的按钮组件,它接受一个label参数作为按钮的文本,以及一个onPressed回调函数来处理点击事件。

注意事项

  • 文档和示例:实际使用时,请查阅该插件的官方文档和示例代码,以了解所有可用的组件和它们的用法。
  • 版本兼容性:确保插件版本与你的Flutter SDK版本兼容。
  • 社区支持:查看插件的GitHub仓库、issue跟踪器和Stack Overflow等社区,以获取帮助和支持。

由于sui是一个假设的插件名称,实际使用时请替换为真实存在的插件名称和版本。如果你有一个特定的UI组件插件名称,但不确定如何使用,请查阅该插件的官方文档或社区资源。

回到顶部