flet icon indicating copy to clipboard operation
flet copied to clipboard

Take screenshot of Controls

Open ndonkoHenri opened this issue 3 months ago • 2 comments

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)

ndonkoHenri avatar May 27 '24 12:05 ndonkoHenri