Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// ignore_for_file: prefer-named-boolean-parameters

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:mix_annotations/mix_annotations.dart';

import '../attributes/text_height_behavior/text_height_behavior_dto.dart';
import '../attributes/text_style/text_style_dto.dart';
import '../core/element.dart';
import '../core/factory/mix_data.dart';
import '../core/helpers.dart';
import '../core/modifier.dart';
import '../core/utility.dart';

part 'default_text_style_widget_modifier.g.dart';

@MixableSpec(components: GeneratedSpecComponents.skipUtility)
final class DefaultTextStyleModifierSpec
extends WidgetModifierSpec<DefaultTextStyleModifierSpec>
with _$DefaultTextStyleModifierSpec, Diagnosticable {
final TextStyle? style;
final TextAlign? textAlign;
final bool? softWrap;
final TextOverflow? overflow;
final int? maxLines;
final TextWidthBasis? textWidthBasis;
final TextHeightBehavior? textHeightBehavior;

const DefaultTextStyleModifierSpec({
this.style,
this.textAlign,
this.softWrap,
this.overflow,
this.maxLines,
this.textWidthBasis,
this.textHeightBehavior,
});

@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
_debugFillProperties(properties);
}

@override
Widget build(Widget child) {
return DefaultTextStyle(
style: style ?? const TextStyle(),
textAlign: textAlign,
softWrap: softWrap ?? true,
overflow: overflow ?? TextOverflow.clip,
maxLines: maxLines,
textWidthBasis: textWidthBasis ?? TextWidthBasis.parent,
textHeightBehavior: textHeightBehavior,
child: child,
);
}
}

final class DefaultTextStyleModifierSpecUtility<T extends Attribute>
extends MixUtility<T, DefaultTextStyleModifierSpecAttribute> {
const DefaultTextStyleModifierSpecUtility(super.builder);
T call({
TextStyle? style,
TextAlign? textAlign,
bool? softWrap,
TextOverflow? overflow,
int? maxLines,
TextWidthBasis? textWidthBasis,
TextHeightBehavior? textHeightBehavior,
}) {
return builder(
DefaultTextStyleModifierSpecAttribute(
style: style?.toDto(),
textAlign: textAlign,
softWrap: softWrap,
overflow: overflow,
maxLines: maxLines,
textWidthBasis: textWidthBasis,
textHeightBehavior: textHeightBehavior?.toDto(),
),
);
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions packages/mix/lib/src/modifiers/widget_modifiers_util.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import '../core/utility.dart';
import 'align_widget_modifier.dart';
import 'aspect_ratio_widget_modifier.dart';
import 'clip_widget_modifier.dart';
import 'default_text_style_widget_modifier.dart';
import 'flexible_widget_modifier.dart';
import 'fractionally_sized_box_widget_modifier.dart';
import 'intrinsic_widget_modifier.dart';
Expand Down Expand Up @@ -34,6 +35,7 @@ abstract class ModifierUtility<T extends StyleElement, Value>
late final flexible = FlexibleModifierSpecUtility(only);
late final expanded = flexible.expanded;
late final transform = TransformModifierSpecUtility(only);
late final defaultTextStyle = DefaultTextStyleModifierSpecUtility(only);

late final scale = transform.scale;
late final align = AlignModifierSpecUtility(only);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mix/mix.dart';

void main() {
group('DefaultTextStyleModifierSpec', () {
testWidgets('should wrap the widget with DefaultTextStyle', (tester) async {
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: Box(
style: Style(
$with.defaultTextStyle(
style: const TextStyle(fontSize: 20, color: Colors.red),
),
),
child: const Text('Hello, world!'),
),
),
);

final context = tester.element(find.text('Hello, world!'));
final defaultTextStyle = DefaultTextStyle.of(context);

expect(defaultTextStyle.style.fontSize, 20);
expect(defaultTextStyle.style.color, Colors.red);
});
});
}
Loading