generateForAnnotatedElement method

  1. @override
Future<String> generateForAnnotatedElement(
  1. Element element,
  2. ConstantReader annotation,
  3. BuildStep buildStep
)

Implement to return source code to generate for element.

This method is invoked based on finding elements annotated with an instance of T. The annotation is provided as a ConstantReader.

Supported return values include a single String or multiple String instances within an Iterable or Stream. It is also valid to return a Future of String, Iterable, or Stream.

Implementations should return null when no content is generated. Empty or whitespace-only String instances are also ignored.

Implementation

@override
Future<String> generateForAnnotatedElement(
  Element element,
  ConstantReader annotation,
  BuildStep buildStep,
) async {
  // Verification that only one light and one dark theme exist
  final themeData = await _loadDataFromJson<WidgetbookThemeData>(
    buildStep,
    '**.theme.widgetbook.json',
    (map) => WidgetbookThemeData.fromMap(map),
  );

  final stories = await _loadDataFromJson<WidgetbookStoryData>(
    buildStep,
    '**.story.widgetbook.json',
    (map) => WidgetbookStoryData.fromMap(map),
  );

  final name = _getName(annotation);
  final devices = _getDevices(annotation);
  final lightTheme =
      themeData.firstWhereOrDefault((element) => !element.isDarkTheme);
  final darkTheme =
      themeData.firstWhereOrDefault((element) => element.isDarkTheme);
  final defaultThemeIsDark = _getDefaultTheme(annotation);
  final foldersExpanded = _getFoldersExpanded(annotation);
  final widgetsExpanded = _getWidgetsExpanded(annotation);

  final buffer = StringBuffer()
    ..writeln(
      generateImports(
        [
          ...themeData,
          ...stories,
        ],
      ),
    )
    ..writeln(
      generateMain(),
    )
    ..writeln(
      generateWidgetbook(
        name: name,
        lightTheme: lightTheme,
        darkTheme: darkTheme,
        defaultThemeIsDark: defaultThemeIsDark,
        stories: stories,
        devices: devices,
        foldersExpanded: foldersExpanded,
        widgetsExpanded: widgetsExpanded,
      ),
    );

  return buffer.toString();
}