本文整合 Everything Claude Code 中面向 Dart/Flutter 和 Perl 的生产级 Skill 体系,提供从 UI 状态管理、代码审查到现代测试与安全防护的跨语言操作指南。开发者可通过遵循 BLoC/Riverpod 模式、Test2::V0 驱动开发、taint mode 输入校验等具体步骤,在 AI 编程助手协作下系统性提升代码质量、安全性与可维护性。

Flutter 生产级模式与 Dart/Perl 测试体系:跨平台 UI、TDD 与安全实践

在采用 AI 编程助手进行跨语言项目开发时,缺乏统一的工程规范是导致代码质量参差、安全隐患频发的主要原因。Everything Claude Code 为 Dart/Flutter 和 Perl 提供了系统的生产级模式、测试与安全实践。本文将把这些 Skill 的核心操作步骤整合为一份连贯指南,覆盖从 UI 状态管理到后端安全编码的关键环节。

1. Flutter 生产级状态管理与导航模式

在 Claude Code 中开发新 Flutter 页面时,可直接调用 dart-flutter-patterns Skill 获取结构化模板。以下为典型操作流程。

目标:实现一个带登录状态检查的商品列表页,使用 Riverpod 管理状态,GoRouter 控制导航。

步骤 1:定义不可变状态与业务逻辑 Skill 会生成使用 freezed 包的不可变数据类,确保状态安全。

// 使用 Freezed 生成不可变状态
@freezed
class Product with _$Product {
  const factory Product({
    required String id,
    required String name,
    required double price,
    @Default(0) int quantity,
  }) = _Product;
}

步骤 2:创建状态管理器 (Riverpod) Skill 推荐使用 @riverpod 注解,并为异步操作封装状态。

@riverpod
class ProductListNotifier extends _$ProductListNotifier {
  @override
  Future<List<Product>> build() => _repository.fetchProducts();

  Future<void> refresh() async {
    state = const AsyncValue.loading();
    state = await AsyncValue.guard(() => _repository.fetchProducts());
  }
}

步骤 3:配置路由守卫 (GoRouter) 结合状态管理实现登录检查与重定向。

final router = GoRouter(
  refreshListenable: GoRouterRefreshStream(authStateProvider.stream),
  redirect: (context, state) {
    final isLoggedIn = ref.read(authStateProvider) != null;
    final isLoginRoute = state.matchedLocation == '/login';
    if (!isLoggedIn && !isLoginRoute) return '/login';
    return null;
  },
  routes: [
    GoRoute(path: '/products', builder: (_, __) => const ProductListScreen()),
    GoRoute(path: '/login', builder: (_, __) => const LoginScreen()),
  ],
);

步骤 4:集成网络请求与错误处理 Skill 会提供 Dio 的拦截器模板,自动处理 Token 刷新和 401 错误。

dio.interceptors.add(InterceptorsWrapper(
  onError: (error, handler) async {
    if (error.response?.statusCode == 401 && !_isRetrying) {
      _isRetrying = true;
      final refreshed = await attemptTokenRefresh();
      _isRetrying = false;
      if (refreshed) {
        return handler.resolve(await dio.fetch(error.requestOptions));
      }
    }
    handler.next(error);
  },
));

错误表现与验证

  • 错误表现:若状态管理未使用 AsyncValue 封装,UI 侧无法统一处理加载、错误状态,导致显示异常。
  • 验证方法:使用 flutter-dart-code-review Skill 自动检查代码。它会提示“ProductListScreen 直接使用了 Future,建议用 AsyncValue 包装以便统一处理状态”。修复后运行 flutter test 并确保所有测试通过。

2. Flutter/Dart 代码审查自动化

在代码提交前,可手动或通过 Hook 触发 flutter-dart-code-review Skill 进行全方位检查。

步骤 1:触发审查 在 Claude Code 中,对包含新 Widget 或修改的 .dart 文件执行审查命令,或通过 PreToolUse Hook 在文件保存时自动触发。

步骤 2:应用结构化检查清单 Skill 会输出分领域报告,开发者需逐项核对。常见关键项包括:

  • Widget 最佳实践build() 方法是否超过 100 行?是否正确使用 const 构造函数?是否在 build() 中执行了耗时计算?
  • 状态管理:状态类是否实现了值相等 (==hashCode)?是否存在循环依赖?
  • 性能:图片列表是否使用了 ListView.builder 实现懒加载?是否有不必要的 setState 调用导致重建?
  • 安全:是否发现 API Key 或密码硬编码在源码中?

步骤 3:根据报告修正代码并验证 例如,报告显示“UserProfileWidget 的 build 方法包含排序逻辑,应移至状态管理层”。修正后,运行 flutter testflutter analyze 确保无回归错误。

3. Perl 现代惯用法与模块化开发

对于 Perl 项目,perl-patterns Skill 确保代码符合 5.36+ 现代标准。

步骤 1:初始化项目结构 Skill 会输出推荐目录结构和 cpanfile 模板。

project/
├── lib/
│   └── MyApp/
├── bin/
├── t/
├── cpanfile
└── .perltidyrc

步骤 2:应用现代语法

  • 签名替代 @_ 解包
use v5.36;
sub create_user ($username, $email, $is_admin = 0) {
    # 直接使用参数,无需 my ($username, $email) = @_;
}
  • Moo 类系统
package MyApp::User;
use Moo;
use Types::Standard qw(Str Int Bool);

has name  => (is => 'ro', isa => Str, required => 1);
has email => (is => 'ro', isa => Str);
has level => (is => 'rw', isa => Int, default => sub { 1 });

1;

步骤 3:安全文件与错误处理

  • 三参 openopen my $fh, '<:encoding(UTF-8)', $file or die "Cannot open $file: $!";
  • Try::Tiny:用 try/catch 替代 eval,更清晰安全。

错误表现与验证

  • 错误表现:使用旧式两参 open$var =~ /(.*)/ 宽泛 untaint 会触发 Skill 安全警告。
  • 验证方法:在 t/ 目录下运行 prove -lv t/00-load.t 确保模块加载正常。使用 perl -c lib/MyApp/User.pm 进行语法检查。

4. Perl 测试驱动开发 (TDD) 与覆盖率保障

perl-testing Skill 引导完整的 TDD 流程。

步骤 1:编写失败测试 (Red) 先创建测试文件 t/unit/calculator.t

use v5.36;
use Test2::V0;
use MyApp::Calculator;

subtest 'addition' => sub {
    my $calc = MyApp::Calculator->new;
    is($calc->add(2, 3), 5, '2 + 3 = 5');
};

done_testing;

步骤 2:运行测试并实现功能 (Green)

prove -lv t/unit/calculator.t
# 预期输出:Failed test '2 + 3 = 5'
# 然后编写 MyApp::Calculator::add 方法使测试通过。

步骤 3:重构与 Mock 隔离 当被测代码依赖外部 API 时,使用 Test::MockModule 隔离。

subtest 'mock API call' => sub {
    my $mock_api = Test::MockModule->new('MyApp::API');
    $mock_api->mock(get_user => sub { {name => 'Mock'} });

    my $result = MyApp::Service->fetch_user_name(1);
    is($result, 'Mock', 'returned mocked user name');
};

步骤 4:集成覆盖率分析 (Devel::Cover)

cover -test && cover -report html
# 打开 cover_db/coverage.html 查看报告。
# CI 中可设置阈值:cover -test && cover -report text | perl -ne 'exit 1 if /Total.*?(\d+)/ && $1 < 80'

5. Perl 安全编码实践

perl-security Skill 自动强制执行安全基线。

步骤 1:启用 Taint Mode 在脚本首行使用 -T 标志,并立即重置 PATH

#!/usr/bin/perl -T
use v5.36;
$ENV{PATH} = '/usr/local/bin:/usr/bin:/bin';
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};

步骤 2:输入校验与 Untaint 对所有外部输入使用正则表达式白名单校验。

sub untaint_id ($input) {
    if ($input =~ /^(\d+)$/) {
        return $1; # 已消毒
    }
    die "Invalid ID: $input";
}

步骤 3:安全数据库交互 (DBI) 必须使用参数化查询,禁止字符串拼接。

# 错误: my $sth = $dbh->do("SELECT * FROM users WHERE email = '$email'");
# 正确:
my $sth = $dbh->prepare('SELECT * FROM users WHERE email = ?');
$sth->execute($email);

步骤 4:集成 perlcritic 安全策略 在项目根目录创建 .perlcriticrc 并启用安全主题。

severity = 3
theme = security + core
[InputOutput::RequireThreeArgOpen]
severity = 5

在 CI 中运行 perlcritic --profile .perlcriticrc lib/ 以阻断不安全代码。

FAQ

Q: 这些 Skill 生成的代码能否直接用于生产环境? A: 是的。所有 Skill 的输出模板和模式均基于社区公认的生产级最佳实践。开发者仍需根据具体业务逻辑进行适配和调整。

Q: 如何将 Dart 代码审查和 Perl 测试集成到 CI/CD 流水线? A: 可将 flutter analyzeflutter testprove -lr t/ 命令加入 CI 脚本。结合 Devel::Cover 设置覆盖率阈值,以及 perlcritic 安全检查,可构建质量门控。详见 Everything Claude Code 的 DevOps 工作流实践

Q: Skill 支持自定义团队特定的模式或规则吗? A: 支持。可通过扩展 Skill 配置文件,或在项目的 .claude/rules.yaml 中定义额外的审查规则、命名约定或允许的依赖库,实现团队规范定制化。