Skip to content

Commit

Permalink
feat(widgetbook): ⚡ added text knob multiline
Browse files Browse the repository at this point in the history
  • Loading branch information
mulieriq committed Dec 19, 2022
1 parent 79c5e42 commit af40092
Show file tree
Hide file tree
Showing 8 changed files with 175 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import 'package:flutter/material.dart';
import 'package:widgetbook/widgetbook.dart';

class MultiLineKnob extends StatelessWidget {
const MultiLineKnob({
Key? key,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return Text(context.knobs.text(
label: 'MultiLine',
multiline: true,
initialValue: '''// Headers
for (var level = 1; level <= 6; level++)
AppHeaderBlot(
level: level,
child: defaultText,
),''',
));
}
}
11 changes: 10 additions & 1 deletion examples/widgetbook_example/widgetbook/widgetbook.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:widgetbook_example/themes/dark_theme.dart';
import 'package:widgetbook_example/themes/light_theme.dart';
import 'package:widgetbook_example/widgets/attributes/price_attribute.dart';
import 'package:widgetbook_example/widgets/attributes/weight_attribute.dart';
import 'package:widgetbook_example/widgets/attributes/multiline_knob.dart';
import 'package:widgetbook_example/widgets/ingredients.dart';
import 'package:widgetbook_example/widgets/meal_detail.dart';
import 'package:widgetbook_example/widgets/new_tag.dart';
Expand Down Expand Up @@ -251,7 +252,15 @@ class HotreloadWidgetbook extends StatelessWidget {
weight: 1050,
),
),

],
),
WidgetbookComponent(
name: 'Knobs',
useCases: [
WidgetbookUseCase(
name: 'Multiline Knob',
builder: (context) => MultiLineKnob(),
),
],
),
],
Expand Down
8 changes: 6 additions & 2 deletions packages/widgetbook/lib/src/knobs/knobs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,14 @@ class KnobsNotifier extends ChangeNotifier implements KnobsBuilder {
required String label,
String? description,
String initialValue = '',
bool multiline = false,
}) =>
_addKnob(
TextKnob(
label: label,
value: initialValue,
description: description,
multiline: multiline,
),
);

Expand All @@ -126,12 +128,14 @@ class KnobsNotifier extends ChangeNotifier implements KnobsBuilder {
required String label,
String? description,
String? initialValue,
bool multiline = false,
}) =>
_addKnob(
NullableTextKnob(
label: label,
value: initialValue,
description: description,
multiline: multiline,
),
);

Expand Down Expand Up @@ -237,8 +241,8 @@ class KnobWrapper extends StatelessWidget {
required this.description,
required this.title,
this.nullableCheckbox,
Key? key,
}) : super(key: key);
super.key,
});

final Widget child;
final String? description;
Expand Down
2 changes: 2 additions & 0 deletions packages/widgetbook/lib/src/knobs/knobs_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ abstract class KnobsBuilder {
required String label,
String? description,
String initialValue,
bool multiline,
});

/// Creates a textfield that can be typed in and optionally hold a
Expand All @@ -31,6 +32,7 @@ abstract class KnobsBuilder {
required String label,
String? description,
String? initialValue,
bool multiline,
});

/// Creates a slider that can be slid to specific double values. You can use
Expand Down
39 changes: 19 additions & 20 deletions packages/widgetbook/lib/src/knobs/text_knob.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,16 @@ import 'package:widgetbook/src/knobs/nullable_checkbox.dart';

class TextKnob extends Knob<String> {
TextKnob({
required String label,
String? description,
required String value,
}) : super(
label: label,
description: description,
value: value,
);

required super.label,
super.description,
required super.value,
required this.multiline,
});
final bool multiline;
@override
Widget build() => TextKnobWidget(
label: label,
multiline: multiline,
description: description,
value: value,
key: ValueKey(this),
Expand All @@ -25,38 +23,38 @@ class TextKnob extends Knob<String> {

class NullableTextKnob extends Knob<String?> {
NullableTextKnob({
required String label,
String? description,
required String? value,
}) : super(
label: label,
description: description,
value: value,
);

required super.label,
super.description,
required super.value,
required this.multiline,
});
final bool multiline;
@override
Widget build() => TextKnobWidget(
label: label,
description: description,
value: value,
nullable: true,
multiline: multiline,
key: ValueKey(this),
);
}

class TextKnobWidget extends StatefulWidget {
const TextKnobWidget({
Key? key,
super.key,
required this.label,
required this.description,
required this.value,
required this.multiline,
this.nullable = false,
}) : super(key: key);
});

final String label;
final String? description;
final String? value;
final bool nullable;
final bool multiline;

@override
State<TextKnobWidget> createState() => _TextKnobWidgetState();
Expand Down Expand Up @@ -88,6 +86,7 @@ class _TextKnobWidgetState extends State<TextKnobWidget> {
)
: null,
child: TextField(
maxLines: widget.multiline ? null : 1,
key: Key('${widget.label}-textKnob'),
controller: controller,
onChanged: (v) {
Expand Down
76 changes: 76 additions & 0 deletions packages/widgetbook/test/src/knobs/multiline_text_knob_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:widgetbook/src/knobs/knobs.dart';
import 'package:widgetbook/src/knobs/text_knob.dart';

import '../../helper/widget_test_helper.dart';
import 'knobs_test.dart';

void main() {
const textFinderKey = Key('multilineKnobKey');
const initialTextValue = '''
// Headers
for (var level = 1; level <= 6; level++)
AppHeaderBlot(
level: level,
child: defaultText,
),''';

group('$TextKnob', () {
testWidgets(
'is multiline',
(WidgetTester tester) async {
await tester.pumpWidgetWithMaterialApp(
renderWithKnobs(
build: (context) => [
Text(
context.knobs.text(
multiline: true,
label: 'label',
initialValue: initialTextValue,
),
key: textFinderKey,
)
],
),
);

final textFinder = find.byKey(
const Key('label-textKnob'),
);

expect(textFinder, findsWidgets);

final multilineText = textFinder.evaluate().first.widget as TextField;
expect(multilineText.maxLines, null);
},
);

testWidgets(
'is not multiline',
(WidgetTester tester) async {
await tester.pumpWidgetWithMaterialApp(
renderWithKnobs(
build: (context) => [
Text(
context.knobs.text(
label: 'label',
initialValue: initialTextValue,
),
)
],
),
);

final textFinder = find.byKey(
const Key('label-textKnob'),
);

expect(textFinder, findsWidgets);

final multilineText = textFinder.evaluate().first.widget as TextField;
expect(multilineText.maxLines, 1);
},
);
});
}
23 changes: 20 additions & 3 deletions packages/widgetbook/test/src/knobs/nullable_text_knob_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,26 @@ void main() {
testWidgets(
'Equality operator works correctly',
(WidgetTester tester) async {
final first = NullableTextKnob(label: 'first', value: null);
final second = NullableTextKnob(label: 'second', value: 'value');
expect(first, equals(NullableTextKnob(label: 'first', value: null)));
final first = NullableTextKnob(
label: 'first',
value: null,
multiline: false,
);
final second = NullableTextKnob(
label: 'second',
value: 'value',
multiline: false,
);
expect(
first,
equals(
NullableTextKnob(
label: 'first',
value: null,
multiline: false,
),
),
);
expect(first, isNot(equals(second)));
},
);
Expand Down
23 changes: 20 additions & 3 deletions packages/widgetbook/test/src/knobs/text_knob_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,27 @@ void main() {
testWidgets(
'Equality operator works correctly',
(WidgetTester tester) async {
final first = TextKnob(label: 'first', value: 'hello');
final second = TextKnob(label: 'second', value: 'goodbye');
final first = TextKnob(
label: 'first',
value: 'hello',
multiline: false,
);
final second = TextKnob(
label: 'second',
value: 'goodbye',
multiline: false,
);

expect(first, equals(TextKnob(label: 'first', value: 'hello')));
expect(
first,
equals(
TextKnob(
label: 'first',
value: 'hello',
multiline: false,
),
),
);
expect(first, isNot(equals(second)));
},
);
Expand Down

0 comments on commit af40092

Please sign in to comment.