Flutter钱包助记词管理插件wallet_words的使用
Flutter钱包助记词管理插件wallet_words的使用
wallet_words
受 Flutter Chips Input 启发。
wallet_words
是一个用于构建输入字段的 Flutter 包,该输入字段通过用户使用的芯片作为输入。此包主要用于加密货币钱包的助记词导入。
优化
使该包更适合于加密货币钱包的助记词导入。更新了所有代码以适应最新的 Dart SDK,并添加了新功能和一些重构。
使用
有两个构建器:chipBuilder
返回 (context, state, T data)
以构建所需的芯片,如果 suggestionsBuilder
不为 null
,则返回 (context, state, T data)
以构建任何类型的建议供用户选择(例如,单词列表)。
findSuggestions
提供查找数据并返回查询结果到 suggestionsBuilder
的能力。onChanged
返回每次更改后的 <T>
数据列表。
其他有用的特性包括显示 wordCountText
,这是一个位于文本框右下角的 Widget
,用于显示用户已输入多少个单词,以及错误/信息/成功消息以给用户提供反馈。
查看示例获取更多信息。
选择建议或手动输入
您可以为用户提供一些建议(参见 suggestionsBuilders
),让他们从中选择一个,或者允许他们自行输入。随着用户输入,单词计数也会增加。
粘贴助记词
用户还可以粘贴一系列单词:
自定义消息
您可以通过将 Widget
传递到 feedbackMsg
参数来让用户知道他们的操作状态:
安装
安装说明请参阅 这里。
导入
import 'package:wallet_words/wallet_words.dart';
示例
WordsChip<String>(
key: _chipKey,
chipBuilder: (context, state, String word) {
return InputChip(
key: ObjectKey(word),
label: Text(word),
onDeleted: () => state.deleteChip(word),
);
},
suggestionBuilder: (context, state, String word, qty) {
return ListTile(
key: ObjectKey(word),
title: Text(word),
onTap: () => state.selectSuggestion(word),
);
},
findSuggestions: (String query) {
if (query.isNotEmpty) {
final lowercaseQuery = query.toLowerCase();
return mockWords.where((word) {
return word.toLowerCase().contains(query.toLowerCase());
}).toList(growable: false)
..sort(
(a, b) =>
a.toLowerCase().indexOf(lowercaseQuery).compareTo(
b.toLowerCase().indexOf(lowercaseQuery),
),
);
}
return mockWords;
},
onChanged: (List<String> data) {
setState(() {
_wordCount = data.length;
});
},
suggestionsHeightFromTop: 250,
tooltip: SizedBox(
width: 70.sp,
height: 35.sp,
child: const Center(
child: Text(
'Paste',
style: TextStyle(
fontFamily: 'Roboto',
fontSize: 12,
color: Colors.white,
),
),
),
),
tooltipArrowHeight: 5,
),
完整示例Demo
import 'dart:math';
import 'package:appsize/appsize.dart';
import 'package:flutter/material.dart';
import 'package:wallet_words/wallet_words.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: 'Wallet words',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
builder: (context, child) {
return AppSize(builder: (context, orientation, deviceType) => child!);
},
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _chipKey = GlobalKey<WordsChipState<String>>();
int _wordCount = 0;
[@override](/user/override)
Widget build(BuildContext context) {
const mockWords = [
'abandon',
'hello',
'hi',
'cliff',
'desk',
'office',
'phone',
'food',
'pizza',
'car',
'motorcycle',
'bus'
];
return Scaffold(
appBar: AppBar(title: const Text('Wallet words Input Example')),
resizeToAvoidBottomInset: false,
body: Padding(
padding: const EdgeInsets.all(20),
child: SingleChildScrollView(
child: Column(
children: [
const SizedBox(
height: 50,
),
Stack(
children: [
WordsChip<String>(
key: _chipKey,
chipBuilder: (context, state, String word) {
return InputChip(
key: ObjectKey('${word}_${Random().nextInt(1000)}'),
label: Text(word),
onDeleted: () => state.deleteChip(word),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
);
},
suggestionBuilder: (context, state, String word, qty) {
return ListTile(
key: ObjectKey(word),
title: Text(word),
onTap: () => state.selectSuggestion(word),
);
},
suggestionsHeightFromTop: 250,
findSuggestions: (String query) {
if (query.isNotEmpty) {
final lowercaseQuery = query.toLowerCase();
return mockWords.where((word) {
return word
.toLowerCase()
.contains(query.toLowerCase());
}).toList(growable: false)
..sort(
(a, b) =>
a
.toLowerCase()
.indexOf(lowercaseQuery)
.compareTo(
b.toLowerCase().indexOf(lowercaseQuery),
),
);
}
return mockWords;
},
onChanged: (List<String> data) {
setState(() {
_wordCount = data.length;
});
},
keyboardAppearance: Brightness.dark,
textCapitalization: TextCapitalization.words,
textBoxDecoration: BoxDecoration(
border: Border.all(
color: Theme.of(context).dividerColor,
),
borderRadius: BorderRadius.circular(4),
),
textStyle: const TextStyle(
height: 1.5,
fontFamily: 'Roboto',
fontSize: 16,
),
validator: (data) {
if (data.isEmpty) {
return 'Please select at least one person';
}
return 'error';
},
feedbackMsg: Row(
children: const [
Icon(Icons.cancel, size: 20, color: Colors.red),
Text('Custom Error msg'),
],
),
minTextBoxHeight: 205,
maxChips: 24,
wordCountText: Text('$_wordCount words'),
tooltip: Container(
decoration: BoxDecoration(
color: Colors.green,
borderRadius: BorderRadius.circular(5),
),
width: 70.sp,
height: 40.sp,
child: const Center(
child: Text(
'Paste',
style: TextStyle(
fontFamily: 'Roboto',
fontSize: 12,
color: Colors.white,
),
),
),
),
tooltipArrowHeight: 5,
inputAction: TextInputAction.next,
),
],
),
],
),
),
),
);
}
}
更多关于Flutter钱包助记词管理插件wallet_words的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter钱包助记词管理插件wallet_words的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
wallet_words
是一个 Flutter 插件,用于生成、导入和导出钱包助记词(也称为种子短语或恢复短语)。这些助记词通常用于加密货币钱包,以便在设备丢失或损坏时恢复钱包。以下是使用 wallet_words
插件的基本步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 wallet_words
插件的依赖:
dependencies:
flutter:
sdk: flutter
wallet_words: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 导入包
在你的 Dart 文件中导入 wallet_words
包:
import 'package:wallet_words/wallet_words.dart';
3. 生成助记词
使用 generateMnemonic()
方法生成一个助记词:
String mnemonic = await WalletWords.generateMnemonic();
print('Generated Mnemonic: $mnemonic');
4. 导入助记词
如果你已经有一个助记词,可以使用 importMnemonic()
方法导入:
String importedMnemonic = 'your existing mnemonic here';
WalletWords.importMnemonic(importedMnemonic);
5. 导出助记词
你可以使用 exportMnemonic()
方法获取当前钱包的助记词:
String exportedMnemonic = await WalletWords.exportMnemonic();
print('Exported Mnemonic: $exportedMnemonic');
6. 验证助记词
你可以使用 validateMnemonic()
方法来验证一个助记词是否有效:
bool isValid = await WalletWords.validateMnemonic(mnemonic);
print('Is the mnemonic valid? $isValid');
7. 清除助记词
如果你不再需要助记词,可以使用 clearMnemonic()
方法清除它:
await WalletWords.clearMnemonic();
8. 安全性注意事项
- 保密性: 助记词是访问你钱包的关键,务必保密,不要分享给任何人。
- 备份: 建议将助记词写在纸上并存放在安全的地方,避免丢失。
- 加密存储: 在应用中存储助记词时,确保使用加密存储,以提高安全性。
9. 示例代码
以下是一个完整的示例代码,展示了如何使用 wallet_words
插件生成、导入、导出和验证助记词:
import 'package:flutter/material.dart';
import 'package:wallet_words/wallet_words.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Wallet Words Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
String mnemonic = await WalletWords.generateMnemonic();
print('Generated Mnemonic: $mnemonic');
},
child: Text('Generate Mnemonic'),
),
ElevatedButton(
onPressed: () async {
String importedMnemonic = 'your existing mnemonic here';
await WalletWords.importMnemonic(importedMnemonic);
print('Mnemonic Imported');
},
child: Text('Import Mnemonic'),
),
ElevatedButton(
onPressed: () async {
String exportedMnemonic = await WalletWords.exportMnemonic();
print('Exported Mnemonic: $exportedMnemonic');
},
child: Text('Export Mnemonic'),
),
ElevatedButton(
onPressed: () async {
String mnemonic = 'your mnemonic here';
bool isValid = await WalletWords.validateMnemonic(mnemonic);
print('Is the mnemonic valid? $isValid');
},
child: Text('Validate Mnemonic'),
),
ElevatedButton(
onPressed: () async {
await WalletWords.clearMnemonic();
print('Mnemonic Cleared');
},
child: Text('Clear Mnemonic'),
),
],
),
),
),
);
}
}