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

1 回复

更多关于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'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部