You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多包Flutter项目中Widgetbook无法访问其他包的问题排查

问题分析

Widgetbook代码生成器默认仅扫描当前包内的代码,不会自动识别依赖包(如ui包)中的@UseCase注解,这是导致CenteredTextButton的UseCase未出现在widgetapp生成文件中的核心原因。

最优解决方法

通过配置build_runner,让Widgetbook生成器主动扫描依赖包的源码,无需在ui包中维护冗余的Widgetbook代码。

步骤1:配置build.yaml

在widgetapp包的根目录创建build.yaml文件,添加如下配置:

targets:
  $default:
    builders:
      widgetbook_generator:widgetbook_generator:
        options:
          include:
            - "../ui/lib/**.dart"

该配置指定生成器扫描ui包下所有dart文件,收集其中的@UseCase注解。

步骤2:清理冗余代码

删除ui包中创建的空WidgetbookApp类及自动生成的widgetbook.directories.g.dart文件,保持UI包的纯粹性。

步骤3:重新生成代码

回到widgetapp包,执行代码生成命令:

dart run build_runner build --delete-conflicting-outputs

步骤4:恢复WidgetbookApp代码

将widgetapp中的WidgetbookApp恢复为原始写法,无需再合并多个directories:

import 'package:flutter/material.dart';
import 'package:widgetbook/widgetbook.dart';
import 'package:widgetbook_annotation/widgetbook_annotation.dart' as widgetbook;

import 'widgetbook.directories.g.dart';

@widgetbook.App()
class WidgetbookApp extends StatelessWidget {
  const WidgetbookApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Widgetbook.material(
      directories: directories,
      addons: [],
      integrations: [],
    );
  }
}
方案优势
  • 遵循单一职责:ui包仅负责组件实现和UseCase定义,无需维护Widgetbook相关代码。
  • 集中管理:所有Widgetbook配置统一在widgetapp包,降低维护成本。
  • 扩展性强:后续新增其他组件包时,仅需在build.yaml中添加对应路径即可。
临时方案的不足

你当前的临时方案虽能解决问题,但存在明显缺陷:

  • ui包中冗余的Widgetbook代码增加了包的复杂度。
  • 需要在多个包中执行build_runner操作,容易遗漏。
  • 手动合并directories的方式扩展性差,新增包时需重复类似操作。

内容的提问来源于stack exchange,提问作者matteoh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:55:15