1+ import 'dart:ui' as ui;
12import 'dart:ui' ;
23
34import 'package:collection/collection.dart' ;
45import 'package:flutter/cupertino.dart' ;
56import 'package:flutter/foundation.dart' ;
67import 'package:flutter/material.dart' ;
8+ import 'package:flutter/rendering.dart' ;
79import 'package:flutter/services.dart' ;
810import 'package:flutter_localizations/flutter_localizations.dart' ;
911import 'package:provider/provider.dart' ;
@@ -25,6 +27,7 @@ import '../utils/platform_utils_web.dart'
2527import '../utils/session_store_web.dart'
2628 if (dart.library.io) "../utils/session_store_non_web.dart" ;
2729import '../utils/theme.dart' ;
30+ import '../utils/time.dart' ;
2831import '../utils/user_fonts.dart' ;
2932import '../widgets/animated_transition_page.dart' ;
3033import '../widgets/loading_page.dart' ;
@@ -44,6 +47,7 @@ class PageControl extends StatefulWidget {
4447
4548class _PageControlState extends State <PageControl > with WidgetsBindingObserver {
4649 final _navigatorKey = GlobalKey <NavigatorState >();
50+ final _rootKey = GlobalKey ();
4751 late final RouteState _routeState;
4852 late final SimpleRouterDelegate _routerDelegate;
4953 late final RouteParser _routeParser;
@@ -52,7 +56,7 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
5256 ServiceRegistry ? _userServices;
5357 bool ? _prevOnKeyboardEvent;
5458 bool _keyboardHandlerSubscribed = false ;
55-
59+ double _dpr = 1.0 ;
5660 String ? _prevViewRoutes;
5761
5862 final Map <int , MultiView > _multiViews = < int , MultiView > {};
@@ -87,13 +91,14 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
8791 onRestart: () => _handleAppLifecycleTransition ('restart' ));
8892
8993 _attachKeyboardListenerIfNeeded ();
94+ widget.control.addInvokeMethodListener (_invokeMethod);
9095 }
9196
9297 @override
9398 void didChangeDependencies () {
9499 debugPrint ("Page.didChangeDependencies: ${widget .control .id }" );
95100 super .didChangeDependencies ();
96-
101+ _dpr = MediaQuery . devicePixelRatioOf (context);
97102 _loadFontsIfNeeded (FletBackend .of (context));
98103 }
99104
@@ -148,9 +153,30 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
148153 if (_keyboardHandlerSubscribed) {
149154 HardwareKeyboard .instance.removeHandler (_handleKeyDown);
150155 }
156+ widget.control.removeInvokeMethodListener (_invokeMethod);
151157 super .dispose ();
152158 }
153159
160+ Future <dynamic > _invokeMethod (String name, dynamic args) async {
161+ debugPrint ("Page.$name ($args )" );
162+ switch (name) {
163+ case "take_screenshot" :
164+ if (_rootKey.currentContext == null ) {
165+ return null ;
166+ }
167+ await Future .delayed (
168+ parseDuration (args["delay" ], const Duration (milliseconds: 20 ))! );
169+ final boundary = _rootKey.currentContext! .findRenderObject ()
170+ as RenderRepaintBoundary ;
171+ final image = await boundary.toImage (
172+ pixelRatio: parseDouble (args["pixel_ratio" ], _dpr)! );
173+ final data = await image.toByteData (format: ui.ImageByteFormat .png);
174+ return data! .buffer.asUint8List ();
175+ default :
176+ throw Exception ("Unknown Page method: $name " );
177+ }
178+ }
179+
154180 void _updateMultiViews () {
155181 if (! widget.control.backend.multiView) {
156182 return ;
@@ -383,7 +409,7 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
383409 var showSemanticsDebugger =
384410 control.getBool ("show_semantics_debugger" , false )! ;
385411
386- var app = widgetsDesign == PageDesign .cupertino
412+ Widget ? app = widgetsDesign == PageDesign .cupertino
387413 ? home != null
388414 ? CupertinoApp (
389415 debugShowCheckedModeBanner: false ,
@@ -432,6 +458,14 @@ class _PageControlState extends State<PageControl> with WidgetsBindingObserver {
432458 supportedLocales: localeConfiguration.supportedLocales,
433459 locale: localeConfiguration.locale,
434460 );
461+
462+ if (control.getBool ("enable_screenshots" ) == true ) {
463+ app = RepaintBoundary (
464+ key: _rootKey,
465+ child: app,
466+ );
467+ }
468+
435469 return PageContext (
436470 themeMode: themeMode,
437471 brightness: brightness,
0 commit comments