Flutter样式随机生成插件style_random的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter样式随机生成插件style_random的使用

特性

style_random 是一个用于生成随机字符串的插件,可用于多种需求。这个插件通过单一模板解析并生成符合所有条件的随机代码。style_random 主要设计用于在 style_dart 后端框架中自定义数据标识符、一次性密码(OTP)、双因素认证(2FA)和短链接等。

此外,在实现 WebSocket 时创建定制协议,可以通过验证客户端或服务器接收的随机消息标识符是否使用相同的密钥模板来增加额外的安全措施。

入门指南

定义模板

void main() {
  final generator = RandomGenerator("/l(5)A{-}/l(10)[#a]/e(#)/s({AEIOU})");
}

模板含义

顺序:

  • 5个大写字母。
  • 一个 -
  • 10个小写字母或数字(无序)

附加条件:

  • 必须以元音字母开头
  • 必须以数字结尾

生成

void main() {
  final generator = RandomGenerator("/l(5)A{-}/l(10)[#a]/e(#)/s({AEIOU})");
  print(generator.generateString());
}

生成结果:

URTYU-o92j72h484
AKOFK-37nj239564
EXMNO-73r2621302
UFKTJ-578u2lpo83
OFKIG-54o75p7730
EKXTQ-2lydl02b39

语法

我们可以从解释数字开始;

  1. 构成模板的元素是 表达式选项

    • 表达式是 字符类字符组静态字符。这些将在下面进行说明。
    a [A#] {-}
    
    • a 小写字母
    • [A#] 大写字母或数字
    • {-} 只有 -
  2. 模板末尾的选项影响整个模板。因此我们称之为 全局选项

    <option><class> 这个选项只影响该类。
    <class1><class2><option> 这个选项影响整个模板。
    

    所有选项都以 /<option-name> 开始。 此外,选项可以带有参数,如 /<option-name>(<param1>,<param2>)

    /l(10) a
    

    例如,l 是长度选项,当给定字符类时,它确定将产生多少个此类实例。

    a # /l(15)
    

    类似地,当作为全局选项给出时,它确定产生的随机值的长度。

  3. 我们可以用字符类组而不是单个字符类。分组与常规书写的不同之处在于顺序。常规书写是按顺序排列的,而分组是从组内随机选择的。

    a [A#] {-}
    

    这条语句会按顺序生成 a[A#]- 的字符串。 但是表达式 [A#] 在自身内部是无序的。

    例如:

    void main() {
      var gen = RandomGenerator("/l(5)a /l(5)[A#] {-}");
      print(gen.generateString());
    }
    

    所有输出按 a(小写字母)-> [A#](组)-> -(静态)排序。 但是 [A](大写字母)和 #(数字)是它们内部无序的。

    输出结果:

    jrloh68GXB-
    kycmrZVR28-
    hxeqaV24XO-
    qefqmM16WK-
    odpbuB7O7I-
    yonidUBXUC-
    

使用方法

字符类

  • . 任意字符。(ASCII 33-126)
  • # 任意数字(包含9)
  • * 任意字母。(ASCII 65-90 和 97-122)
  • l 小写字母。(ASCII 65-90)
  • L 大写字母。(ASCII 97-122)
  • s 任意特殊字符。(ASCII 33-47, 58-64, 91-96, 123-126)
  • w 任意特殊字符,排除 URL 特定字符

  • [<cl><cl>] 字符类组。组内不进行排序。

    [a #]  小写字母或数字
    

静态表达式

  • 静态字符用 {} 表示。静态表达式实例化其内容。

    例如:{-}{42}{xyz}

选项

长度 /l()

长度选项可以添加到任何位置。当添加到表达式时,它决定该表达式的长度;当添加到全局选项时,它决定整个表达式的长度。 长度选项可以接受固定数或范围。

固定:

当给定常数如 /l(<n>) 时,正好生成 n 次。

范围:

长度可以在一定范围内定义。

如果给定了范围作为长度,则生成器会检查父级子级的长度。如果不可能,则会在定义 RandomGenerator 时抛出错误。

这种不可能的情况发生在子级的最大值小于由父级(如全局 /l())为该子级设置的最小值等情况下。

有三种范围定义方式:

  • /l(<min>-<max>) 定义最小值和最大值。
  • /l(-<max>) 定义最大值。如果没有为该表达式设置父级最小值,则最小值可以为0。因此,可能根本不会生成此表达式。
  • /l(<min>-) 定义最小值,最大值为无穷。当使用此表达式时,必须由父级限制长度。否则,将抛出错误,提示 “max unbounded”。

如果使用范围作为长度,则生成器在构建时会随机确定这些区间的长度。

静态表达式的长度始终是其内部字符串的长度。

{-}      : 自动添加 /l(1)
{mehmet} : 自动添加 /l(6)

长度选项会自动根据子级父级关系确定未指定长度的表达式的长度。

所有结果都遵循相同的模板:

1. exp |      2.exp      | 3. exp | global opts
     a     /l(5)   [A#]     {-}       /l(11)
/l(5)a     /l(5)   [A#]     {-}
/l(5)a     /l(1-10)[A#]     {-}       /l(11)
/l(5)a             [A#]     {-}       /l(11)
a        [/l(3)A/l(2)#]     {-}       /l(11)

结束选项

结束选项指定了表达式开始或结束(最后一个索引)的条件。

这些结束表达式定义为 <option-name>(classes or characters)

它可以接受多个参数。字符类名称必须直接给出,特定字符必须放在 {} 中。参数之间用逗号分隔。

例如:

/s(a,{-},{@5c}) .

任何字符(ASCII 33-126),但必须以以下之一开始;

  • a 小写字母
  • {-} 字符 -
  • {@5c} 字符 “@” 或 “5” 或 “c”

有四种类型的结束选项。

  • /s(&lt;cl&gt;|&lt;char&gt;) 开始于
  • /e(&lt;cl&gt;|&lt;char&gt;) 结束于
  • &lt;(&lt;cl&gt;|&lt;char&gt;) 不以…开始
  • &gt;(&lt;cl&gt;|&lt;char&gt;) 不以…结束

如果出于安全目的(例如生成密钥)使用这些选项,防止或减少重复或随机值相似的模板不会使您的密钥更安全。相反,会使它更不安全。

生成长度

如果使用范围作为长度,生成器在构建时会随机确定这些区间的长度。

这意味着所有结果都将具有相同的长度。但如果您希望每次实例生成时长度重新选择(性能略有下降),则应设置 onGenerateLength: true

void main() {
  var gen = RandomGenerator(
      "/l(1-9)# /l(1-9)a /l(10)",
      onGenerateLength: true
  );
}

在这个例子中,生成长度在1-9之间的数字和长度在1-9之间的小写字母。

如果想让这些长度每次生成时改变,结果可能是这样的:

              #  a
1402joprny    4  6
149375894j    9  1
1951222jid    7  3
045325921b    9  1
62275783mz    8  2
883267zryq    6  4

如果 onGenerateLength: false :

             #  a
0050lpzaeb   4  6  // 在第一次实例生成时确定了长度
3540ozjutp   4  6
4886zraewb   4  6
5013hcuovm   4  6
6461wcwdkd   4  6
2639wjysim   4  6

自定义随机代理

定义自定义随机

class CustomRandom extends RandomDelegate {
  CustomRandom() : super();

  @override
  int nextInt(int max) {
    return 10;
  }
}

使用

void main() {
  var gen = RandomGenerator(
      "a[/l(3)A/l(2)#]{-}/l(11)",
      randomDelegate: CustomRandom()
  );
}

示例模板

验证码 /l(3)# {-} /l(3)#

880-282
208-235
239-205
956-849
206-311
745-154

短链接

使用 URL 可用的特定字符:[*#w]/l(30)

))T(s-U8IfA6J4((b699l((c8cR34t
4w49!_1R3i'-.((*tvs!-Q7IdG1VtC
l61Y27.20_7*37'3if9Rnsn85g0wAu
!L1X!x4-1')!c8G(_U0__6R738qxhI
4g'X'6uUT-L..49T_*n_U'17y*60Vv
5-Q7LEA__6-6O25r36)1giH(4(.u78

不使用特定字符:[*#]/l(30)

密码建议 ./l(16)

j+kKM]DDM"ne/2&lt;&gt;
(I+WHx7k@^kd^Xg^
Bd49/`&gt;VM:jTr"yS
iyOQHVv]yinU7`%A
XQyS$o&amp;-_62;0`2_
^[@/A#(X`If5+((M

Firebase 文档 ID [*#]/l(20)

gQ9gaPh4e2J31U1CxedB
t09R5h053T19NG0bh2uK
W65r2UP099IDux645l8A
Pw601wg6Tq7kb63BN36O
f9n50Y4504B93D6LNjNV
C65Gn41MMLX59Wl326p9

酷代码 :) {S} ## {-} /l(4)A {-} /l(4)#

在预约码、订单码等看似有意义的代码中,可能需要生成看似有意义的代码。

S45-FGJJ-5453
S77-IRTY-5725
S21-SLGB-9247
S56-NBKN-3393
S88-DAEB-6465
S31-QNJO-1611

更多关于Flutter样式随机生成插件style_random的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter样式随机生成插件style_random的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter样式随机生成插件style_random的示例代码。这个插件允许你随机生成样式,比如颜色、字体大小等。

首先,确保你已经在pubspec.yaml文件中添加了style_random依赖:

dependencies:
  flutter:
    sdk: flutter
  style_random: ^latest_version  # 请替换为最新版本号

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

接下来是一个简单的Flutter应用示例,展示了如何使用style_random插件来随机生成文本样式:

import 'package:flutter/material.dart';
import 'package:style_random/style_random.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: RandomStyleScreen(),
    );
  }
}

class RandomStyleScreen extends StatefulWidget {
  @override
  _RandomStyleScreenState createState() => _RandomStyleScreenState();
}

class _RandomStyleScreenState extends State<RandomStyleScreen> {
  TextStyle? randomTextStyle;

  @override
  void initState() {
    super.initState();
    _generateRandomTextStyle();
  }

  void _generateRandomTextStyle() {
    final StyleRandom styleRandom = StyleRandom();

    // 随机生成一个TextStyle
    TextStyle randomStyle = styleRandom.randomTextStyle(
      color: true,         // 是否随机生成颜色
      fontSize: true,      // 是否随机生成字体大小
      fontWeight: true,    // 是否随机生成字体粗细
      letterSpacing: true, // 是否随机生成字间距
    );

    setState(() {
      randomTextStyle = randomStyle;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Random Style Generator'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Hello, Flutter!',
              style: randomTextStyle,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _generateRandomTextStyle,
              child: Text('Generate New Style'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先添加了style_random依赖。
  2. 创建了一个简单的Flutter应用,包含一个RandomStyleScreen页面。
  3. RandomStyleScreen页面的状态管理中,我们定义了一个randomTextStyle变量来存储随机生成的TextStyle
  4. 使用StyleRandom类的randomTextStyle方法来生成一个随机的TextStyle,并更新状态。
  5. 在UI中,我们展示了一个带有随机样式的文本,并提供了一个按钮来生成新的随机样式。

你可以根据需要调整randomTextStyle方法的参数,以生成不同的随机样式。

回到顶部