generateBase method
Implementation
void generateBase(MapEntry? mapEntry) {
if (mapEntry != null) {
final dirColor = join(pathColors, 'src');
DirectoryHelper.createDir(dirColor);
final pathBaseColor = join(dirColor, 'morpheme_color.dart');
final colors = mapEntry.value['colors'] is Map
? mapEntry.value['colors'] as Map
: {};
pathBaseColor.write('''import 'package:flutter/material.dart';
extension MorphemeColorExtension on BuildContext {
MorphemeColor get color => Theme.of(this).extension<MorphemeColor>()!;
}
class MorphemeColor extends ThemeExtension<MorphemeColor> {
MorphemeColor({
${colors.entries.map((e) => ' required this.${e.key.toString().camelCase},').join('\n')}
});
${colors.entries.map((e) {
final key = e.key.toString().camelCase;
if (e.value is Map) {
return ''' final MaterialColor ${key.camelCase};''';
} else {
return ''' final Color ${key.camelCase};''';
}
}).join('\n')}
@override
MorphemeColor copyWith({
${colors.entries.map((e) {
final key = e.key.toString().camelCase;
if (e.value is Map) {
return ''' MaterialColor? ${key.camelCase},''';
} else {
return ''' Color? ${key.camelCase},''';
}
}).join('\n')}
}) {
return MorphemeColor(
${colors.entries.map((e) => ' ${e.key.toString().camelCase}: ${e.key.toString().camelCase} ?? this.${e.key.toString().camelCase},').join('\n')}
);
}
@override
MorphemeColor lerp(covariant MorphemeColor? other, double t) {
if (other is MorphemeColor) {
return this;
}
return MorphemeColor(
${colors.entries.map((e) {
final key = e.key.toString().camelCase;
if (e.value is Map) {
return ''' ${key.camelCase}: other?.${key.camelCase} ?? ${key.camelCase},''';
} else {
return ''' ${key.camelCase}: Color.lerp(${key.camelCase}, other?.${key.camelCase}, t) ?? ${key.camelCase},''';
}
}).join('\n')}
);
}
}
''');
final dirTheme = join(pathThemes, 'src');
DirectoryHelper.createDir(dirTheme);
final pathBaseTheme = join(dirTheme, 'morpheme_theme.dart');
if (!exists(pathBaseTheme)) {
pathBaseTheme.write('''import 'package:flutter/material.dart';
import '../../morpheme_colors/morpheme_colors.dart';
abstract base class MorphemeTheme {
MorphemeTheme(this.id);
final String id;
MorphemeColor get color;
ThemeData get rawThemeData;
ColorScheme get colorScheme;
TextTheme get _getTextTheme => GoogleFonts.robotoTextTheme()
.apply(bodyColor: color.black, displayColor: color.black)
.merge(MorphemeTextTheme.textTheme);
ThemeData get themeData => rawThemeData.copyWith(
scaffoldBackgroundColor: color.white,
extensions: [color],
appBarTheme: AppBarTheme(
elevation: 0,
color: color.white,
foregroundColor: color.black,
titleTextStyle: _getTextTheme.titleLarge,
),
colorScheme: colorScheme,
textTheme: _getTextTheme,
inputDecorationTheme: InputDecorationTheme(
hintStyle: _getTextTheme.bodyMedium?.apply(color: color.grey1),
fillColor: color.white,
filled: true,
contentPadding: const EdgeInsets.symmetric(
horizontal: MorphemeSizes.s16,
vertical: MorphemeSizes.s8,
),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: color.grey1, width: 1),
borderRadius: BorderRadius.circular(MorphemeSizes.s8),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: color.grey1, width: 1),
borderRadius: BorderRadius.circular(MorphemeSizes.s8),
),
focusedErrorBorder: OutlineInputBorder(
borderSide: BorderSide(color: color.grey1, width: 1),
borderRadius: BorderRadius.circular(MorphemeSizes.s8),
),
errorBorder: OutlineInputBorder(
borderSide: BorderSide(color: color.error, width: 1),
borderRadius: BorderRadius.circular(MorphemeSizes.s8),
),
disabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: color.grey1, width: 1),
borderRadius: BorderRadius.circular(MorphemeSizes.s8),
),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
textStyle: _getTextTheme.labelLarge,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(MorphemeSizes.s8)),
),
padding: const EdgeInsets.symmetric(horizontal: MorphemeSizes.s16),
),
),
outlinedButtonTheme: OutlinedButtonThemeData(
style: OutlinedButton.styleFrom(
textStyle: _getTextTheme.labelLarge,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(MorphemeSizes.s8)),
),
padding: const EdgeInsets.symmetric(horizontal: MorphemeSizes.s16),
),
),
textButtonTheme: TextButtonThemeData(
style: TextButton.styleFrom(
textStyle: _getTextTheme.labelLarge,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(MorphemeSizes.s8)),
),
padding: const EdgeInsets.symmetric(horizontal: MorphemeSizes.s16),
),
),
);
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is MorphemeTheme && other.id == id;
}
@override
int get hashCode => id.hashCode;
}
''');
}
}
}