Skip to content

Commit da2e028

Browse files
committed
[rfw] Add Flexible widget support to core widgets
1 parent 1a72287 commit da2e028

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

packages/rfw/lib/src/flutter/core_widgets.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import 'runtime.dart';
3434
/// * [DefaultTextStyle]
3535
/// * [Directionality]
3636
/// * [Expanded]
37+
/// * [Flexible]
3738
/// * [FittedBox]
3839
/// * [FractionallySizedBox]
3940
/// * [GestureDetector]
@@ -349,6 +350,14 @@ Map<String, LocalWidgetBuilder> get _coreWidgetsDefinitions => <String, LocalWid
349350
);
350351
},
351352

353+
'Flexible': (BuildContext context, DataSource source) {
354+
return Flexible(
355+
flex: source.v<int>(['flex']) ?? 1,
356+
fit: ArgumentDecoders.enumValue<FlexFit>(FlexFit.values, source, ['fit']) ?? FlexFit.loose,
357+
child: source.child(['child']),
358+
);
359+
},
360+
352361
'FittedBox': (BuildContext context, DataSource source) {
353362
return FittedBox(
354363
fit: ArgumentDecoders.enumValue<BoxFit>(BoxFit.values, source, ['fit']) ?? BoxFit.contain,

packages/rfw/test/core_widgets_test.dart

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,4 +300,137 @@ void main() {
300300
expect(renderClip.clipBehavior, equals(Clip.antiAlias));
301301
expect(renderClip.borderRadius, equals(BorderRadius.zero));
302302
});
303+
304+
testWidgets('Flexible widget', (WidgetTester tester) async {
305+
final Runtime runtime = Runtime()
306+
..update(const LibraryName(<String>['core']), createCoreWidgets());
307+
addTearDown(runtime.dispose);
308+
final DynamicContent data = DynamicContent();
309+
310+
// Test Flexible with default values
311+
runtime.update(const LibraryName(<String>['test']), parseLibraryFile('''
312+
import core;
313+
widget root = Directionality(
314+
textDirection: "ltr",
315+
child: Column(
316+
children: [
317+
Flexible(
318+
child: Text(text: "Default flexible"),
319+
),
320+
],
321+
),
322+
);
323+
'''));
324+
325+
await tester.pumpWidget(
326+
RemoteWidget(
327+
runtime: runtime,
328+
data: data,
329+
widget: const FullyQualifiedWidgetName(LibraryName(<String>['test']), 'root'),
330+
),
331+
);
332+
await tester.pump();
333+
expect(find.byType(Flexible), findsOneWidget);
334+
final Flexible defaultFlexible = tester.widget<Flexible>(find.byType(Flexible));
335+
expect(defaultFlexible.flex, equals(1));
336+
expect(defaultFlexible.fit, equals(FlexFit.loose));
337+
338+
// Test Flexible with custom flex value
339+
runtime.update(const LibraryName(<String>['test']), parseLibraryFile('''
340+
import core;
341+
widget root = Directionality(
342+
textDirection: "ltr",
343+
child: Column(
344+
children: [
345+
Flexible(
346+
flex: 3,
347+
child: Text(text: "Custom flex"),
348+
),
349+
],
350+
),
351+
);
352+
'''));
353+
await tester.pumpAndSettle();
354+
final Flexible customFlexFlexible = tester.widget<Flexible>(find.byType(Flexible));
355+
expect(customFlexFlexible.flex, equals(3));
356+
expect(customFlexFlexible.fit, equals(FlexFit.loose));
357+
358+
// Test Flexible with fit: "tight"
359+
runtime.update(const LibraryName(<String>['test']), parseLibraryFile('''
360+
import core;
361+
widget root = Directionality(
362+
textDirection: "ltr",
363+
child: Column(
364+
children: [
365+
Flexible(
366+
flex: 2,
367+
fit: "tight",
368+
child: Text(text: "Tight fit"),
369+
),
370+
],
371+
),
372+
);
373+
'''));
374+
await tester.pumpAndSettle();
375+
final Flexible tightFlexible = tester.widget<Flexible>(find.byType(Flexible));
376+
expect(tightFlexible.flex, equals(2));
377+
expect(tightFlexible.fit, equals(FlexFit.tight));
378+
379+
// Test Flexible with fit: "loose"
380+
runtime.update(const LibraryName(<String>['test']), parseLibraryFile('''
381+
import core;
382+
widget root = Directionality(
383+
textDirection: "ltr",
384+
child: Column(
385+
children: [
386+
Flexible(
387+
flex: 4,
388+
fit: "loose",
389+
child: Text(text: "Loose fit"),
390+
),
391+
],
392+
),
393+
);
394+
'''));
395+
await tester.pumpAndSettle();
396+
final Flexible looseFlexible = tester.widget<Flexible>(find.byType(Flexible));
397+
expect(looseFlexible.flex, equals(4));
398+
expect(looseFlexible.fit, equals(FlexFit.loose));
399+
400+
// Test multiple Flexible widgets in a Column
401+
runtime.update(const LibraryName(<String>['test']), parseLibraryFile('''
402+
import core;
403+
widget root = Directionality(
404+
textDirection: "ltr",
405+
child: Column(
406+
children: [
407+
Flexible(
408+
flex: 1,
409+
fit: "loose",
410+
child: Text(text: "First"),
411+
),
412+
Flexible(
413+
flex: 2,
414+
fit: "tight",
415+
child: Text(text: "Second"),
416+
),
417+
Flexible(
418+
flex: 1,
419+
child: Text(text: "Third"),
420+
),
421+
],
422+
),
423+
);
424+
'''));
425+
await tester.pumpAndSettle();
426+
expect(find.byType(Flexible), findsNWidgets(3));
427+
428+
final List<Flexible> flexibleWidgets = tester.widgetList<Flexible>(find.byType(Flexible)).toList();
429+
expect(flexibleWidgets[0].flex, equals(1));
430+
expect(flexibleWidgets[0].fit, equals(FlexFit.loose));
431+
expect(flexibleWidgets[1].flex, equals(2));
432+
expect(flexibleWidgets[1].fit, equals(FlexFit.tight));
433+
expect(flexibleWidgets[2].flex, equals(1));
434+
expect(flexibleWidgets[2].fit, equals(FlexFit.loose));
435+
});
303436
}

0 commit comments

Comments
 (0)