From c7b1ac5100d4f6b12b076f17ec5fe4a22076d3b1 Mon Sep 17 00:00:00 2001 From: Philipp Bauer Date: Fri, 27 Feb 2026 23:40:11 +0100 Subject: [PATCH 1/3] [rfw] coerce numeric values in core Text widget --- .../rfw/lib/src/flutter/core_widgets.dart | 19 +++++++- packages/rfw/test/core_widgets_test.dart | 43 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/packages/rfw/lib/src/flutter/core_widgets.dart b/packages/rfw/lib/src/flutter/core_widgets.dart index b8f479f9646d..5f932d8fc613 100644 --- a/packages/rfw/lib/src/flutter/core_widgets.dart +++ b/packages/rfw/lib/src/flutter/core_widgets.dart @@ -651,11 +651,28 @@ 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 String? stringSegment = source.v(['text', index]); + if (stringSegment != null) { + builder.write(stringSegment); + continue; + } + + final int? intSegment = source.v(['text', index]); + if (intSegment != null) { + builder.write(intSegment.toString()); + continue; + } + + final double? doubleSegment = source.v(['text', index]); + if (doubleSegment != null) { + builder.write(doubleSegment.toString()); + } } text = builder.toString(); } 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); + }); } From 3058a1086c193e8d0be644431c32163cae2085b5 Mon Sep 17 00:00:00 2001 From: Philipp Bauer Date: Fri, 27 Feb 2026 23:50:46 +0100 Subject: [PATCH 2/3] [rfw] Bump version and update changelog for numeric text coercion --- packages/rfw/CHANGELOG.md | 4 ++++ packages/rfw/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) 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/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 From 0eb3cb6e20a7cd44bf76b3c9e29b4dc6b5896317 Mon Sep 17 00:00:00 2001 From: Philipp Bauer Date: Sat, 28 Feb 2026 00:14:42 +0100 Subject: [PATCH 3/3] Use more elegant syntax Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../rfw/lib/src/flutter/core_widgets.dart | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/packages/rfw/lib/src/flutter/core_widgets.dart b/packages/rfw/lib/src/flutter/core_widgets.dart index 5f932d8fc613..d385154a207d 100644 --- a/packages/rfw/lib/src/flutter/core_widgets.dart +++ b/packages/rfw/lib/src/flutter/core_widgets.dart @@ -657,21 +657,12 @@ Map get _coreWidgetsDefinitions => (['text', index]); - if (stringSegment != null) { - builder.write(stringSegment); - continue; - } - - final int? intSegment = source.v(['text', index]); - if (intSegment != null) { - builder.write(intSegment.toString()); - continue; - } - - final double? doubleSegment = source.v(['text', index]); - if (doubleSegment != null) { - builder.write(doubleSegment.toString()); + 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();