diff --git a/packages/rfw/CHANGELOG.md b/packages/rfw/CHANGELOG.md index f9538956d3c9..5abed6ab2dc7 100644 --- a/packages/rfw/CHANGELOG.md +++ b/packages/rfw/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.3 + +* Coerces `int` and `double` values to `String` in the core `Text` widget adapter for both direct and list-based `text` values. + ## 1.1.2 * Removes outdated call for feedback from the README. diff --git a/packages/rfw/lib/src/flutter/core_widgets.dart b/packages/rfw/lib/src/flutter/core_widgets.dart index b8f479f9646d..d385154a207d 100644 --- a/packages/rfw/lib/src/flutter/core_widgets.dart +++ b/packages/rfw/lib/src/flutter/core_widgets.dart @@ -651,11 +651,19 @@ Map get _coreWidgetsDefinitions => (['text']); + text ??= source.v(['text'])?.toString(); + text ??= source.v(['text'])?.toString(); if (text == null) { final builder = StringBuffer(); final int count = source.length(['text']); for (var index = 0; index < count; index += 1) { - builder.write(source.v(['text', index]) ?? ''); + final List key = ['text', index]; + String? segment = source.v(key); + segment ??= source.v(key)?.toString(); + segment ??= source.v(key)?.toString(); + if (segment != null) { + builder.write(segment); + } } text = builder.toString(); } diff --git a/packages/rfw/pubspec.yaml b/packages/rfw/pubspec.yaml index 72341a9f8462..f4233d22e326 100644 --- a/packages/rfw/pubspec.yaml +++ b/packages/rfw/pubspec.yaml @@ -2,7 +2,7 @@ name: rfw description: "Remote Flutter widgets: a library for rendering declarative widget description files at runtime." repository: https://github.com/flutter/packages/tree/main/packages/rfw issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+rfw%22 -version: 1.1.2 +version: 1.1.3 environment: sdk: ^3.9.0 diff --git a/packages/rfw/test/core_widgets_test.dart b/packages/rfw/test/core_widgets_test.dart index 421e983e7e5e..5b4e22dcb785 100644 --- a/packages/rfw/test/core_widgets_test.dart +++ b/packages/rfw/test/core_widgets_test.dart @@ -491,4 +491,47 @@ void main() { expect(flexibleWidgets[2].flex, equals(1)); expect(flexibleWidgets[2].fit, equals(FlexFit.loose)); }); + + testWidgets('Text renders numeric dynamic values', (WidgetTester tester) async { + final runtime = Runtime() + ..update(const LibraryName(['core']), createCoreWidgets()); + addTearDown(runtime.dispose); + final data = DynamicContent() + ..update('singleInt', 42) + ..update('left', 67) + ..update('right', 69) + ..update('singleDouble', 13.37) + ..update('leftDouble', -9000.01) + ..update('rightDouble', 9000.01); + + runtime.update(const LibraryName(['test']), parseLibraryFile(''' + import core; + widget root = Directionality( + textDirection: "ltr", + child: Column( + crossAxisAlignment: "start", + children: [ + Text(text: data.singleInt), + Text(text: [data.left, " / ", data.right]), + Text(text: data.singleDouble), + Text(text: [data.leftDouble, " / ", data.rightDouble]), + ], + ), + ); + ''')); + + await tester.pumpWidget( + RemoteWidget( + runtime: runtime, + data: data, + widget: const FullyQualifiedWidgetName(LibraryName(['test']), 'root'), + ), + ); + await tester.pump(); + + expect(find.text('42'), findsOneWidget); + expect(find.text('67 / 69'), findsOneWidget); + expect(find.text('13.37'), findsOneWidget); + expect(find.text('-9000.01 / 9000.01'), findsOneWidget); + }); }