Take screenshot of Controls
Closes #317
Test Code
import flet as ft
def main(page):
page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
page.on_error = lambda e: print(e.data)
page.scroll = True
def handle_click(e):
d = page.take_screenshot(c.uid)
page.set_clipboard(d) # could be viewed here: https://www.rapidtables.com/web/tools/base64-to-image.html
page.add(ft.Image(src_base64=d))
page.add(
c := ft.Container(content=ft.Text("Hello, World!"), bgcolor=ft.colors.RED_200),
ft.OutlinedButton("Take ScreenShot", on_click=handle_click),
)
ft.app(target=main)
Note
Getting the below error with the current implementation:
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following StoreProviderError<StoreProvider<AppState>> was thrown building
StoreConnector<AppState, ControlViewModel?>-[<'_2'>](dirty):
Error: No StoreProvider<AppState> found. To fix, please try:
* Wrapping your MaterialApp with the StoreProvider<State>,
rather than an individual Route
* Providing full type information to your Store<State>,
StoreProvider<State> and StoreConnector<State, ViewModel>
* Ensure you are using consistent and complete imports.
E.g. always use `import 'package:my_app/app_state.dart';
If none of these solutions work, please file a bug at:
https://github.com/brianegan/flutter_redux/issues/new
The relevant error-causing widget was:
StoreConnector<AppState, ControlViewModel?>-[<'_2'>]
StoreConnector:file:///Users/ndonkohenri/PycharmProjects/flet-dev/flet/packages/flet/lib/src/controls/create_control.dart:121:10
When the exception was thrown, this was the stack:
#0 StoreProvider.of (package:flutter_redux/flutter_redux.dart:78:27)
#1 StoreConnector.build (package:flutter_redux/flutter_redux.dart:324:28)
#2 StatelessElement.build (package:flutter/src/widgets/framework.dart:5550:49)
#3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5480:15)
#4 Element.rebuild (package:flutter/src/widgets/framework.dart:5196:7)
#5 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:5462:5)
#6 ComponentElement.mount (package:flutter/src/widgets/framework.dart:5456:5)
... Normal element mounting (7 frames)
#13 Element.inflateWidget (package:flutter/src/widgets/framework.dart:4335:16)
#14 Element.updateChild (package:flutter/src/widgets/framework.dart:3846:18)
#15 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/adapter.dart:143:16)
#16 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/adapter.dart:112:5)
#17 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/adapter.dart:61:18)
#18 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2844:19)
#19 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/adapter.dart:60:13)
#20 ScreenshotController.widgetToUiImage (package:screenshot/screenshot.dart:192:16)
#21 ScreenshotController.captureFromWidget (package:screenshot/screenshot.dart:102:28)
#22 takeScreenshot (package:flet/src/utils/screenshot.dart:16:8)
#23 appReducer (package:flet/src/reducers.dart:301:15)
#24 Store._createReduceAndNotify.<anonymous closure> (package:redux/src/store.dart:235:28)
#25 Store.dispatch (package:redux/src/store.dart:267:27)
#26 FletServer._onMessage (package:flet/src/flet_server.dart:237:16)
#27 FletWebSocketServerProtocol._onMessage (package:flet/src/flet_server_protocol_web_socket.dart:56:14)
#45 new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1144:21)
#51 _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:332:23)
#52 _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:226:46)
#60 _Socket._onData (dart:io-patch/socket_patch.dart:2447:41)
#67 new _RawSocket.<anonymous closure> (dart:io-patch/socket_patch.dart:1936:33)
#68 _NativeSocket.issueReadEvent.issue (dart:io-patch/socket_patch.dart:1379:14)
(elided 37 frames from dart:async)
File "C:\Users\Muddassir Farooq\AppData\Local\Programs\Python\Python312\Lib\concurrent\futures\thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Muddassir Farooq\AppData\Local\Programs\Python\Python312\Lib\site-packages\flet_core\page.py", line 528, in wrapper handler(*args) File "c:\Users\Muddassir Farooq\Desktop\Python Projects\Flet Projects\Ambassadors\test.py", line 9, in handle_click page.add(ft.Image(src_base64=page.take_screenshot(c.uid))) ^^^^^^^^^^^^^^^^^^^^ AttributeError: 'Page' object has no attribute 'take_screenshot'
It wasn't merged yet