Flutter空安全支持插件lexpro_nullsafety的使用

Flutter空安全支持插件lexpro_nullsafety的使用

lexpro nullsafety 版本

说明:将合并到 lexpro 3,支持完整的空安全。

示意图

如果您的项目 SDK 版本高于 2.12,请在 pubspec.yaml 中将 lexpro 更改为 lexpro_nullsafety

要查看更多用法,请访问 lexpro 2

示例代码

示例代码

import 'package:lexpro_nullsafety/lexpro_nullsafety.dart';
import 'package:lexpro_nullsafety/lexers/example/library/JamvAttrLib.dart';

const DynamicToken TAG = DynamicToken('TAG');
const DynamicToken Tstart = DynamicToken('T.start');
const DynamicToken Tend = DynamicToken('T.end');
const DynamicToken endT = DynamicToken('end.T');
const DynamicToken closeT = DynamicToken('close.T');
const DynamicToken Attr = DynamicToken('Attr');
const DynamicToken Vstart = DynamicToken('V.start');
const DynamicToken Vend = DynamicToken('V.end');
const DynamicToken ValuePart = DynamicToken('Value.part');

DynamicToken BLANK = DynamicToken.from(Token.Text);

class XMLlikeLexer extends DTokenedRegexLexer {
  [@override](/user/override)
  Map<String, List<JParse>> get parses => {
        'root': [
          JParse.bygroups(r'(&lt;\/)([^/&gt;]+)([\t\ ]*)(&gt;)([\t\ \n]*)',
              [Tend, TAG, BLANK, endT, BLANK]),
          JParse.bygroups(
              r'(&lt;)([^\/&gt;\ ]+)', [Tstart, TAG], ['end_or_attrorend']),
        ],
        'include-end': [
          JParse.bygroups(r'(\/&gt;)([\t\ \n]*)', [
            DynamicToken.fromEnum(['/&gt;'], named: closeT),
            BLANK
          ], [
            POPROOT
          ]),
          JParse.bygroups(r'(&gt;)([\t\ \n]*)', [
            DynamicToken.fromEnum(['&gt;'], named: endT),
            BLANK
          ], [
            POPROOT
          ])
        ],
        'end-error': [
          JParse.include('include-end'),
          JParse.empty(['error_no_tag_closing'])
        ],
        // 在此状态下,所有解析规则都可以枚举以进行自动补全。
        'end_or_attrorend': [
          // 空格 + 属性或结束符号
          JParse(r'[\t\ ]+', DynamicToken.fromEnum([' '], named: BLANK),
              ['attr_or_end']),
          // 只有结束符号
          JParse.include('include-end')
          // 没有 JParse.empty 以便在此循环
        ],
        'attr_or_end': [
          // 包含库,该库具有所有枚举和常量以进行自动补全。
          // 因为从纯库包含它们需要替换跳转状态。
          // 前缀 'pure-' 表示无状态跳转
          // 前缀 'include-' 表示无 JParse.empty
          JParse.include('include-pure-jamv-attr', replaceAllNewStates: [POP]),
          // 对于所有类型化的词作为枚举
          JParse.include('include-attr', addedNewStates: [POP]),
          JParse.include('include-end'),
          // 如果你想使用自动补全,请不要在这里放错误消息
        ],
        // 支持短属性,没有值部分(="") 必须以字母或 _ 开始
        'include-attr': [
          JParse.bygroups(r'([a-zA-Z_][^\/&gt;\t\ \n]*)(=")', [
            DynamicToken.asEnum(Attr),
            DynamicToken.fromEnum(['="'], named: Vstart)
          ], [
            'value_str'
          ]),
          JParse(r'([a-zA-Z_][^\/&gt;\t\ \n]*)', Attr)
        ],
        'value_str': [
          JParse(r'\\"', ValuePart),
          JParse(r'[^\n"]+', ValuePart),
          // 需要跳出 'value_str' 和 'attr_or_end'
          JParse(r'"', Vend, [POP2]),
          // JParse.bygroups(r'(")([\t\ ]*)', [Vend, BLANK], [POP]),
          JParse.empty(['error_value_should_close_by_quot'])
        ]
      };

  [@override](/user/override)
  Map<String, List<JParse>> commonparses(
          Map<String, List<JParse>>? currentCommon) =>
      {'error_no_tag_closing': [], 'error_value_should_close_by_quot': []};

  [@override](/user/override)
  RegExpFlags get flags =>
      RegExpFlags(
        dotAll: true,
        multiline: true,
      );

  [@override](/user/override)
  String get root => 'root';

  /// 如何在 2.0.0 版本中使用 LexerMain
  LexerMain configLexerMain() {
    return LexerMain.load(libraries: [JamvAttrLib()], root: this)
      ..config = {
        // 仅列出配置打印中的关键令牌。允许使用 DynamicToken、Token 和字符串。
        'stateWillListTokens': [TAG, 'Attr', Token.Error],

        // 需要用于自动补全
        'savingRuntimeContext': true,

        // 事件系统以构建抽象语法树 (AST)
        // 'eventDispatcher': MyEventListener(),

        // 如果存在错误,则触发此选项以查看更多信息。
        'debuggable': false
      }

      // 如果根词法分析器未给出,则从此状态入口测试库。
      // ..libraryRootState('include-jamv-attr')

      /// 确保每个库和根词法分析器之间没有冲突。
      /// 如果存在 'null' 错误,请注意未定义的状态列表。
      ..dependencyAnalyze();

    // 加载顺序:
    // =============================
    // JamvAttrLib(1049837909) >> XMLlikeLexer(520416528) >> root
    // =============================

    // 未使用的状态:
    // =============================
    // JamvAttrLib(1049837909):include-jamv-attr
    // XMLlikeLexer(520416528):root
    // XMLlikeLexer(520416528):end-error

    // =============================
    //                      total: 3
  }
}

void main() {
  const forTest = '''
&lt;correct width="10" green bgcolor:grey paddingLeft_10 &gt;
	&lt;p black87 text-right/&gt;
&lt;/correct&gt;
&lt;error 10 center&gt;
  &lt;wrapper&gt;
  &lt;/wrapper&gt;
	&lt;divider hide/&gt;
&lt;/error&gt;
''';
  var lexer = XMLlikeLexer().configLexerMain();
  print(lexer.pretty(forTest));

  // 输出示例:
  // T.start(&lt;)TAG(correct) Attr(width)V.start(_)Value.part(10) Attr(green) Attr(bgcolor:grey) Attr(paddingLeft_10) end.T(&gt;)
  // 	T.start(&lt;)TAG(p) Attr(black87) Attr(text-right)close.T(/&gt;)
  // T.end(&lt;/)TAG(correct)end.T(&gt;)T.start(&lt;)TAG(error) Error(10 )Attr(center)end.T(&gt;)
  //   T.start(&lt;)TAG(wrapper)end.T(&gt;)
  //   T.end(&lt;/)TAG(wrapper)end.T(&gt;)T.start(&lt;)TAG(divider) Attr(hide)close.T(/&gt;)
  // T.end(&lt;/)TAG(error)end.T(&gt;)

  // 查看错误文本范围及它们所在的状态
  lexer.configPrint();
  // 设置:
  // +============================
  // |  eventDispatcher : null
  // |  savingRuntimeContext : true
  // |  stateWillListTokens : [Token.TAG, Attr, Token.Error]
  // |  useCache : true
  // |  enumStrict : false
  // +============================

  // 状态下的令牌:
  // =============================

  //    TAG:
  //     =========================

  //    root:
  //     correct

  //    root:
  //     p

  //    root:
  //     correct

  //    root:
  //     error

  //    root:
  //     wrapper

  //    root:
  //     wrapper

  //    root:
  //     divider

  //    root:
  //     error

  //     =========================
  //                      total: 8

  // Attr:
  //     =========================

  //    attr_or_end:
  //     width

  //    attr_or_end:
  //     green

  //    attr_or_end:
  //     bgcolor:grey

  //    attr_or_end:
  //     paddingLeft_10

  //    attr_or_end:
  //     black87

  //    attr_or_end:
  //     text-right

  //    attr_or_end:
  //     center

  //    attr_or_end:
  //     hide

  //     =========================
  //                      total: 8

  //    Error:
  //     =========================

  //    attr_or_end:
  //     1

  //    attr_or_end:
  //     0

  //    attr_or_end:

  //     =========================
  //                      total: 3

  // =============================
  //                     total: 19

  print(lexer.autoCompleting('10', 'attr_or_end'));
  // [width="10, width="10", height="10, height="10", maxWidth="10, minWidth="10, maxWidth="10", minWidth="10", maxHeight="10, minHeight="10, maxHeight="10", minHeight="10"]
  print(lexer.splitAutoCompleting(['a', 'l', 'c', 't', 'r'], 'attr_or_end'));
  // [align="center", text-align="center"]
}

更多关于Flutter空安全支持插件lexpro_nullsafety的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter空安全支持插件lexpro_nullsafety的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


lexpro_nullsafety 是一个支持 Flutter 空安全的插件,它可能提供了某些特定的功能或工具来帮助开发者在支持空安全的环境中更轻松地开发应用。由于 lexpro_nullsafety 不是一个广泛使用的官方插件,具体的功能和使用方法可能会根据插件的版本和用途有所不同。

以下是一些通用的步骤,帮助你理解如何在 Flutter 项目中使用支持空安全的插件:

1. 检查插件是否支持空安全

在将插件添加到项目之前,确保插件已经支持空安全。你可以在插件的 pubspec.yaml 文件中查看其 environment 部分,确认其最低支持的 Dart SDK 版本是否为 2.12.0 或更高。

environment:
  sdk: ">=2.12.0 <3.0.0"

2. 添加插件到项目中

pubspec.yaml 文件中添加插件依赖:

dependencies:
  lexpro_nullsafety: ^1.0.0 # 请根据实际版本号进行调整

然后运行 flutter pub get 来获取插件。

3. 导入插件

在需要使用插件的地方导入它:

import 'package:lexpro_nullsafety/lexpro_nullsafety.dart';

4. 使用插件功能

根据插件的文档或源码,调用其提供的功能。例如,如果插件提供了一个 doSomething 方法,你可以这样使用:

void main() {
  var result = LexproNullsafety.doSomething();
  print(result);
}

5. 处理空安全

由于插件支持空安全,你可能需要在代码中处理可能为 null 的情况。例如:

void main() {
  String? nullableString = LexproNullsafety.getNullableString();
  if (nullableString != null) {
    print('String is not null: $nullableString');
  } else {
    print('String is null');
  }
}

6. 调试和测试

在使用插件时,确保进行充分的测试,特别是涉及到空安全的部分。你可以使用 Dart 的静态分析工具来检查代码中的空安全错误:

flutter analyze

7. 参考文档

如果插件有官方文档或示例代码,务必参考这些资源来更好地理解和使用插件。

8. 更新插件

随着 Dart 和 Flutter 的更新,插件可能会发布新版本以支持更多的功能或修复问题。定期检查并更新插件:

flutter pub upgrade
回到顶部