From b21c5424783a9e74cb841a8df7a15f26eba04a7b Mon Sep 17 00:00:00 2001 From: Peixin Li Date: Wed, 13 Mar 2024 17:10:07 -0700 Subject: [PATCH] Support overriding `ErrorWidget.builder` (#6302) *List which issues are fixed by this PR. You must list at least one issue.* Issue: https://github.com/flutter/flutter/issues/144960 --- packages/rfw/.gitignore | 3 +++ packages/rfw/CHANGELOG.md | 3 +++ packages/rfw/lib/src/flutter/runtime.dart | 9 ++++--- packages/rfw/pubspec.yaml | 2 +- packages/rfw/test/runtime_test.dart | 32 +++++++++++++++++++---- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/packages/rfw/.gitignore b/packages/rfw/.gitignore index 01f61108a4..0b90ed48e5 100644 --- a/packages/rfw/.gitignore +++ b/packages/rfw/.gitignore @@ -76,3 +76,6 @@ build/ !**/ios/**/default.mode2v3 !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 + +# Coverage +coverage/ diff --git a/packages/rfw/CHANGELOG.md b/packages/rfw/CHANGELOG.md index b34abdb064..7f1da5e2f3 100644 --- a/packages/rfw/CHANGELOG.md +++ b/packages/rfw/CHANGELOG.md @@ -1,3 +1,6 @@ +## 1.0.26 +* Supports overriding the error widget builder. + ## 1.0.25 * Adds support for wildget builders. diff --git a/packages/rfw/lib/src/flutter/runtime.dart b/packages/rfw/lib/src/flutter/runtime.dart index f66b7cd225..732f345525 100644 --- a/packages/rfw/lib/src/flutter/runtime.dart +++ b/packages/rfw/lib/src/flutter/runtime.dart @@ -1559,11 +1559,12 @@ class _Subscription { } } -ErrorWidget _buildErrorWidget(String message) { - FlutterError.reportError(FlutterErrorDetails( +Widget _buildErrorWidget(String message) { + final FlutterErrorDetails detail = FlutterErrorDetails( exception: message, stack: StackTrace.current, library: 'Remote Flutter Widgets', - )); - return ErrorWidget(message); + ); + FlutterError.reportError(detail); + return ErrorWidget.builder(detail); } diff --git a/packages/rfw/pubspec.yaml b/packages/rfw/pubspec.yaml index 310d7bd653..a83be027aa 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.0.25 +version: 1.0.26 environment: sdk: ^3.2.0 diff --git a/packages/rfw/test/runtime_test.dart b/packages/rfw/test/runtime_test.dart index f081df3e81..05eeb05a1b 100644 --- a/packages/rfw/test/runtime_test.dart +++ b/packages/rfw/test/runtime_test.dart @@ -244,7 +244,7 @@ void main() { ), ); expect(tester.takeException().toString(), contains('Could not find remote widget named')); - expect(tester.widget(find.byType(ErrorWidget)).message, 'Could not find remote widget named widget in a, possibly because some dependencies were missing: b'); + expect(tester.widget(find.byType(ErrorWidget)).message, contains('Could not find remote widget named widget in a, possibly because some dependencies were missing: b')); }); testWidgets('Missing libraries in specified widget', (WidgetTester tester) async { @@ -258,7 +258,7 @@ void main() { ), ); expect(tester.takeException().toString(), contains('Could not find remote widget named')); - expect(tester.widget(find.byType(ErrorWidget)).message, 'Could not find remote widget named widget in a, possibly because some dependencies were missing: a'); + expect(tester.widget(find.byType(ErrorWidget)).message, contains('Could not find remote widget named widget in a, possibly because some dependencies were missing: a')); }); testWidgets('Missing libraries in import via dependency', (WidgetTester tester) async { @@ -276,7 +276,7 @@ void main() { ), ); expect(tester.takeException().toString(), contains('Could not find remote widget named')); - expect(tester.widget(find.byType(ErrorWidget)).message, 'Could not find remote widget named test in a, possibly because some dependencies were missing: b'); + expect(tester.widget(find.byType(ErrorWidget)).message, contains('Could not find remote widget named test in a, possibly because some dependencies were missing: b')); }); testWidgets('Missing widget', (WidgetTester tester) async { @@ -291,7 +291,7 @@ void main() { ), ); expect(tester.takeException().toString(), contains('Could not find remote widget named')); - expect(tester.widget(find.byType(ErrorWidget)).message, 'Could not find remote widget named widget in a.'); + expect(tester.widget(find.byType(ErrorWidget)).message, contains('Could not find remote widget named widget in a.')); }); testWidgets('Runtime', (WidgetTester tester) async { @@ -1152,7 +1152,29 @@ void main() { expect(tester.takeException().toString(), contains(expectedErrorMessage)); expect(find.byType(ErrorWidget), findsOneWidget); - expect(tester.widget(find.byType(ErrorWidget)).message, expectedErrorMessage); + expect(tester.widget(find.byType(ErrorWidget)).message, contains(expectedErrorMessage)); + }); + + + testWidgets('Customized error widget', (WidgetTester tester) async { + final ErrorWidgetBuilder oldBuilder = ErrorWidget.builder; + ErrorWidget.builder = (FlutterErrorDetails details) { + return const Text('oopsie!', textDirection: TextDirection.ltr); + }; + final Runtime runtime = Runtime() + ..update(const LibraryName(['a']), parseLibraryFile('')); + final DynamicContent data = DynamicContent(); + await tester.pumpWidget( + RemoteWidget( + runtime: runtime, + data: data, + widget: const FullyQualifiedWidgetName(LibraryName(['a']), 'widget'), + ), + ); + expect(tester.takeException().toString(), contains('Could not find remote widget named')); + expect(find.text('oopsie!'), findsOneWidget); + expect(find.byType(ErrorWidget), findsNothing); + ErrorWidget.builder = oldBuilder; }); testWidgets('Widget builders - work when scope is not used', (WidgetTester tester) async {