build method

  1. @override
Future<void> build(
  1. BuildStep b
)

Generates the outputs for a given BuildStep.

Implementation

@override
Future<void> build(BuildStep b) async {
  final finalAssetId = AssetId(b.inputId.package, 'lib/main.data.dart');

  final infos = [
    await for (final file in b.findAssets(Glob('**/*.flutter_data.info')))
      await b.readAsString(file)
  ];

  final classes = infos.fold<List<Map<String, String>>>([], (acc, line) {
    for (final e in line.split(';')) {
      final parts = e.split('#');
      acc.add({
        'className': parts[0],
        'classNameLower': DataHelpers.internalTypeFor(parts[0]),
        'type': parts[1],
        'path': parts[2]
      });
    }
    return acc;
  })
    ..sort((a, b) => a['type']!.compareTo(b['type']!));

  // if this is a library, do not generate
  if (classes.any((clazz) => clazz['path']!.startsWith('asset:'))) {
    return;
  }

  final modelImports = classes
      .map((clazz) => 'import \'${clazz['path']}\';')
      .toSet()
      .join('\n');

  // imports

  final hasFlutterRiverpod = await isDependency('flutter_riverpod', b) ||
      await isDependency('hooks_riverpod', b);

  final riverpodFlutterImport = hasFlutterRiverpod
      ? "import 'package:flutter_riverpod/flutter_riverpod.dart';"
      : '';

  //

  String adapterWatcherRefExtension(List<Map<String, String>> classes,
      {required bool hasWidgets}) {
    return '''
${hasWidgets ? '''
extension AdapterWidgetRefX on WidgetRef {
${classes.map((clazz) => '  Adapter<${clazz['className']}> get ${clazz['classNameLower']} => watch(${clazz['classNameLower']}AdapterProvider)..internalWatch = watch;').join('\n')}
}''' : ''}

extension AdapterRefX on ${hasWidgets ? 'Ref' : 'ProviderContainer'} {
${hasWidgets ? '' : '''
E watch<E>(ProviderListenable<E> provider) {
return readProviderElement(provider as ProviderBase<E>).readSelf();
}
'''}
${classes.map((clazz) => '  Adapter<${clazz['className']}> get ${clazz['classNameLower']} => watch(${clazz['classNameLower']}AdapterProvider)..internalWatch = watch${hasWidgets ? ' as Watcher' : ''};').join('\n')}
}''';
  }

  //

  await b.writeAsString(
      finalAssetId,
      '''\n
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: directives_ordering, top_level_function_literal_block, depend_on_referenced_packages

import 'package:flutter_data/flutter_data.dart';
$riverpodFlutterImport

$modelImports

final adapterProvidersMap = <String, Provider<Adapter<DataModelMixin>>>{
${classes.map((clazz) => '\'' + clazz['type']! + '\': ' + clazz['classNameLower']! + 'AdapterProvider').join(',\n')}
};

''' +
          adapterWatcherRefExtension(classes,
              hasWidgets: hasFlutterRiverpod));
}