Flutter UI组件插件sui的使用
Flutter UI组件插件sui的使用
Sui Dart SDK
注意: 此分支正在积极开发中,并可能引入破坏性更改。如果您不需要 Transaction v2 功能,请使用 v1
分支。
安装
dependencies:
sui: ^0.3.7
示例
查看完整的示例代码可以在以下链接找到:
使用
连接到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
更多关于Flutter UI组件插件sui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,使用第三方UI组件插件可以极大地加速开发过程,并提供丰富的功能和美观的界面。尽管没有一个名为sui
的官方或广泛认可的Flutter UI组件插件(可能是指某种特定团队或个人的插件),但我们可以讨论如何使用一般的Flutter UI组件插件,并提供一个示例,假设有一个类似的插件存在。
假设的sui
插件使用示例
首先,确保你的Flutter环境已经设置好,并且你已经创建了一个新的Flutter项目。
-
添加依赖
在你的
pubspec.yaml
文件中添加对sui
插件的依赖(注意:这里sui
是假设的,实际使用时请替换为真实插件的名称和版本)。dependencies: flutter: sdk: flutter sui: ^x.y.z # 替换为实际版本号
然后运行
flutter pub get
来安装依赖。 -
导入插件
在你需要使用
sui
插件的Dart文件中导入它。import 'package:sui/sui.dart';
-
使用插件提供的组件
假设
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组件插件名称,但不确定如何使用,请查阅该插件的官方文档或社区资源。