From 43554074c9ab52a5cef7daefebd8b04fc6ac2af7 Mon Sep 17 00:00:00 2001 From: Tarek Tolba Date: Mon, 11 Nov 2024 16:20:12 +0200 Subject: [PATCH] Add option to pass a custom ScreenshotController --- feedback/lib/src/better_feedback.dart | 8 ++++++++ feedback/lib/src/feedback_widget.dart | 8 ++++---- feedback/lib/src/screenshot.dart | 8 ++++---- feedback/test/feedback_test.dart | 8 ++------ 4 files changed, 18 insertions(+), 14 deletions(-) diff --git a/feedback/lib/src/better_feedback.dart b/feedback/lib/src/better_feedback.dart index 9657add6..cfaa8790 100644 --- a/feedback/lib/src/better_feedback.dart +++ b/feedback/lib/src/better_feedback.dart @@ -5,6 +5,7 @@ import 'package:feedback/src/debug.dart'; import 'package:feedback/src/feedback_builder/string_feedback.dart'; import 'package:feedback/src/feedback_data.dart'; import 'package:feedback/src/feedback_widget.dart'; +import 'package:feedback/src/screenshot.dart'; import 'package:feedback/src/theme/feedback_theme.dart'; import 'package:feedback/src/utilities/feedback_app.dart'; import 'package:feedback/src/utilities/renderer/renderer.dart'; @@ -112,6 +113,7 @@ class BetterFeedback extends StatefulWidget { this.localeOverride, this.mode = FeedbackMode.draw, this.pixelRatio = 3.0, + this.screenshotController, }) : assert( pixelRatio > 0, 'pixelRatio needs to be larger than 0', @@ -176,6 +178,10 @@ class BetterFeedback extends StatefulWidget { /// for information on the underlying implementation. final double pixelRatio; + /// Manages capturing a screenshot of the app's widget tree. + /// If `screenshotController` is null, a new instance will be created by default, + final ScreenshotController? screenshotController; + /// Call `BetterFeedback.of(context)` to get an /// instance of [FeedbackData] on which you can call `.show()` or `.hide()` /// to enable or disable the feedback view. @@ -236,6 +242,8 @@ class _BetterFeedbackState extends State { pixelRatio: widget.pixelRatio, feedbackBuilder: widget.feedbackBuilder ?? simpleFeedbackBuilder, + screenshotController: + widget.screenshotController ?? ScreenshotController(), child: widget.child, ); }, diff --git a/feedback/lib/src/feedback_widget.dart b/feedback/lib/src/feedback_widget.dart index f22acedb..a9117f8d 100644 --- a/feedback/lib/src/feedback_widget.dart +++ b/feedback/lib/src/feedback_widget.dart @@ -27,6 +27,7 @@ class FeedbackWidget extends StatefulWidget { required this.mode, required this.pixelRatio, required this.feedbackBuilder, + required this.screenshotController, }) : assert( // This way, we can have a const constructor // ignore: prefer_is_empty @@ -39,8 +40,8 @@ class FeedbackWidget extends StatefulWidget { final double pixelRatio; final Widget child; final List drawColors; - final FeedbackBuilder feedbackBuilder; + final ScreenshotController screenshotController; @override FeedbackWidgetState createState() => FeedbackWidgetState(); @@ -62,7 +63,6 @@ class FeedbackWidgetState extends State @visibleForTesting late PainterController painterController = create(); - ScreenshotController screenshotController = ScreenshotController(); TextEditingController textEditingController = TextEditingController(); late FeedbackMode mode = widget.mode; @@ -153,7 +153,7 @@ class FeedbackWidgetState extends State // Place the screenshot here so that the widget tree isn't being // arbitrarily rebuilt. child: Screenshot( - controller: screenshotController, + controller: widget.screenshotController, child: PaintOnChild( controller: painterController, isPaintingActive: @@ -270,7 +270,7 @@ class FeedbackWidgetState extends State await _sendFeedback( context, BetterFeedback.of(context).onFeedback!, - screenshotController, + widget.screenshotController, feedback, widget.pixelRatio, extras: extras, diff --git a/feedback/lib/src/screenshot.dart b/feedback/lib/src/screenshot.dart index b37c2b00..b4ab11eb 100644 --- a/feedback/lib/src/screenshot.dart +++ b/feedback/lib/src/screenshot.dart @@ -7,7 +7,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; class ScreenshotController { - final GlobalKey _containerKey = GlobalKey(); + final GlobalKey containerKey = GlobalKey(); Future capture({ double pixelRatio = 1, @@ -15,7 +15,7 @@ class ScreenshotController { }) { //Delay is required. See Issue https://github.com/flutter/flutter/issues/22308 return Future.delayed(delay, () async { - final renderObject = _containerKey.currentContext?.findRenderObject(); + final renderObject = containerKey.currentContext?.findRenderObject(); if (renderObject is! RenderRepaintBoundary) { FlutterError.reportError(_noRenderObject()); @@ -31,7 +31,7 @@ class ScreenshotController { FlutterErrorDetails _noRenderObject() { return FlutterErrorDetails( exception: Exception( - '_containerKey.currentContext is null. ' + 'containerKey.currentContext is null. ' 'Thus we can\'t create a screenshot', ), library: 'feedback', @@ -55,7 +55,7 @@ class Screenshot extends StatelessWidget { @override Widget build(BuildContext context) { return RepaintBoundary( - key: controller._containerKey, + key: controller.containerKey, child: child, ); } diff --git a/feedback/test/feedback_test.dart b/feedback/test/feedback_test.dart index d55e950a..5ffbface 100644 --- a/feedback/test/feedback_test.dart +++ b/feedback/test/feedback_test.dart @@ -174,6 +174,7 @@ void main() { Uint8List? submittedScreenshot; final widget = BetterFeedback( + screenshotController: MockScreenshotController(), child: MyTestApp( onFeedback: (feedback) { submittedText = feedback.text; @@ -183,9 +184,6 @@ void main() { ); await tester.pumpWidget(widget); await tester.pumpAndSettle(); - final feedbackWidgetState = - tester.state(find.byType(FeedbackWidget)); - feedbackWidgetState.screenshotController = MockScreenshotController(); // feedback is closed final userInputFields = find.byKey(const Key('feedback_bottom_sheet')); @@ -219,6 +217,7 @@ void main() { UserFeedback? submittedFeedback; final widget = BetterFeedback( + screenshotController: MockScreenshotController(), child: MyTestApp( onFeedback: (feedback) { submittedFeedback = feedback; @@ -239,9 +238,6 @@ void main() { ); await tester.pumpWidget(widget); await tester.pumpAndSettle(); - final feedbackWidgetState = - tester.state(find.byType(FeedbackWidget)); - feedbackWidgetState.screenshotController = MockScreenshotController(); // feedback is closed final userInputFields = find.byKey(const Key('feedback_bottom_sheet'));