Clipboard剪贴板是App应用必不可少的一个功能。

Clipboard

密码生成之后,用户可能需要复制粘贴,那如何把生成好的密码复制到剪贴板呢?

Flutter早就想到了这个问题,只需要使用Clipboard.setData就可以在剪贴板上设置数据。

修改_generatePassword中的setState,在生成密码之后,把密码设置到Clipboard:

setState(() {
  _password = String.fromCharCodes(tmpPassword);
  Clipboard.setData(ClipboardData(text: _password));
});

重新run之后,当点击Generate按钮之后,不仅可以显示在文本框,还可以切换到基本应用中,复制粘贴新生成的密码。

SnackBar

在使用剪贴板的时候,经常会看到这样一句提示’密码已经复制到剪贴板’,用来提示用户。

在Flutter中,可以通过SnackBar来实现:

void _snackBar() {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        backgroundColor: Colors.blue,
        content: Text(AppLocalizations.of(context).passwordClipboard,
            textAlign: TextAlign.center),
      ),
    );
  }

修改build中的MaterialApp,加入scaffoldMessengerKey管理:

@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context).randomPassword),
        centerTitle: true,
      ),
      body: Column(
        children: <Widget>[
          _switchLowercase(),
          _switchUppercase(),
          _switchNumber(),
          _switchSpecial(),
          _textLength(),
          _textShow(),
          _buttonGenerate(),
        ],
      ),
    );
  }

热加载一个,就可以看到当点击Generate按钮的时候,在最下面会弹出一个提示框,提示用户密码已经复制到粘贴板,过了几秒之后,提示框自动消失。

SnackBar优化

在使用SnackBar中会发现一个问题,就是当连续点击Generate按钮的时候,SnackBar会一个个出来,显得很卡,这是因为SnackBar是用一个队列管理,每一次点击按钮的时候,setData都会在队列中插入一条数据,然后由管理器一个个显示。

可以在setData的时候,调用removeCurrentSnackBar立即删除之前的数据:

void _snackBar() {
    ScaffoldMessenger.of(context).removeCurrentSnackBar();
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        backgroundColor: Colors.blue,
        content: Text(AppLocalizations.of(context).passwordClipboard,
            textAlign: TextAlign.center),
      ),
    );
  }

这样连续点击的时候,提示框会立即出现。

在下一节中,我们将学习如何使用国际化?

0

本文为原创文章,转载请注明出处,欢迎访问作者网站(和而不同)

发表评论

error: Content is protected !!