flutter / flutter

Flutter makes it easy and fast to build beautiful apps for mobile and beyond
https://flutter.dev
BSD 3-Clause "New" or "Revised" License
164.89k stars 27.17k forks source link

Craft better error message for OffsetLayer.toImage in the HTML renderer #49857

Open domesticmouse opened 4 years ago

domesticmouse commented 4 years ago

I'm attempting to convert a Canvas widget's content to an image, using the following code. It works fine on iOS and macOS, but dies on the web.

  Future<void> _capturePng() async {
    RenderRepaintBoundary boundary =
        globalKey.currentContext.findRenderObject();
    ui.Image image = await boundary.toImage(pixelRatio: 1);
    ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);
    Uint8List pngBytes = byteData.buffer.asUint8List();
    print('PNG Image size: ${pngBytes.length}');
  }

VSCode console output:


════════ Exception caught by scheduler library ═════════════════════════════════
The following assertion was thrown during a scheduler callback:
Assertion failed: org-dartlang-sdk:///flutter_web_sdk/lib/_engine/engine/surface/scene_builder.dart:267:12
retainedSurface.isActive || retainedSurface.isReleased
is not true

When the exception was thrown, this was the stack
throw_ (package:dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart:196:49)
assertFailed (package:dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart:26:3)
addRetained (package:build_web_compilers/lib/_engine/engine/surface/scene_builder.dart:267:55)
[_addToSceneWithRetainedRendering]
package:flutter/…/rendering/layer.dart:439
addChildrenToScene
package:flutter/…/rendering/layer.dart:1065
...
════════════════════════════════════════════════════════════════════════════════

JS Console stacktrace

errors.dart:147 Uncaught (in promise) Error: Exception: Incorrect sequence of push/pop operations while building scene surfaces. After building the scene the persisted surface stack must contain a single element which corresponds to the scene itself (_PersistedScene). All other surfaces should have been popped off the stack. Found the following surfaces in the stack:
PersistedScene, PersistedTransform
    at Object.throw_ [as throw] (errors.dart:196)
    at scene_builder.dart:24
    at _engine.SurfaceSceneBuilder.new.get [_persistedScene] (scene_builder.dart:31)
    at _engine.SurfaceSceneBuilder.new.build (scene_builder.dart:514)
    at layer$.OffsetLayer.new.buildScene (layer.dart:807)
    at layer$.OffsetLayer.new.toImage (layer.dart:1240)
    at toImage.next (<anonymous>)
    at runBody (async_patch.dart:86)
    at Object._async [as async] (async_patch.dart:125)
    at layer$.OffsetLayer.new.toImage (layer.dart:1229)
    at proxy_box.RenderRepaintBoundary.new.toImage (proxy_box.dart:2962)
    at main._MyHomePageState.new._capturePng (main.dart:35)
    at _capturePng.next (<anonymous>)
    at runBody (async_patch.dart:86)
    at Object._async [as async] (async_patch.dart:125)
    at main._MyHomePageState.new.[_capturePng] (main.dart:32)
    at _InkResponseState.new.[_handleTap] (ink_well.dart:705)
    at ink_well.dart:788
    at tap.TapGestureRecognizer.new.invokeCallback (recognizer.dart:182)
    at tap.TapGestureRecognizer.new.handleTapUp (tap.dart:486)
    at tap.TapGestureRecognizer.new.[_checkUp] (tap.dart:264)
    at tap.TapGestureRecognizer.new.handlePrimaryPointer (tap.dart:199)
    at tap.TapGestureRecognizer.new.handleEvent (recognizer.dart:470)
    at pointer_router.PointerRouter.new.[_dispatch] (pointer_router.dart:76)
    at pointer_router.dart:117
    at LinkedMap.new.forEach (linked_hash_map.dart:23)
    at pointer_router.PointerRouter.new.[_dispatchEventToRoutes] (pointer_router.dart:115)
    at pointer_router.PointerRouter.new.route (pointer_router.dart:101)
    at binding$5.WidgetsFlutterBinding.new.handleEvent (binding.dart:218)
    at binding$5.WidgetsFlutterBinding.new.dispatchEvent (binding.dart:198)
    at binding$5.WidgetsFlutterBinding.new.[_handlePointerEvent] (binding.dart:156)
    at binding$5.WidgetsFlutterBinding.new.[_flushPointerEventQueue] (binding.dart:102)
    at binding$5.WidgetsFlutterBinding.new.[_handlePointerDataPacket] (binding.dart:86)
    at _engine.PointerBinding.__.[_onPointerData] (pointer_binding.dart:129)
    at pointer_binding.dart:465
    at pointer_binding.dart:430
    at HTMLElement.<anonymous> (pointer_binding.dart:195)
yjbanov commented 4 years ago

OffsetLayer.toImage is not supported on the Web, but we should provide a much better error message.

yjbanov commented 4 years ago

@domesticmouse would you be interested in fixing the error message in a PR that tells developers that this is not currently supported?

domesticmouse commented 4 years ago

I’m currently in I/O crunch, so I’m happy to look at this, but it’ll be a month or two before I have time.

sh0umik commented 4 years ago

Is there any updates on this ? This feature would be much useful if it runs on web.

I am getting

Exception: Incorrect sequence of push/pop operations while building scene surfaces. After building the scene the persisted surface stack must contain a single element which corresponds to the scene itself (_PersistedScene). All other surfaces should have been popped off the stack. Found the following surfaces in the stack:
PersistedScene, PersistedTransform
══╡ EXCEPTION CAUGHT BY SCHEDULER LIBRARY ╞═════════════════════════════════════════════════════════
The following assertion was thrown during a scheduler callback:
Assertion failed:
org-dartlang-sdk:///flutter_web_sdk/lib/_engine/engine/surface/scene_builder.dart:267:12
retainedSurface.isActive || retainedSurface.isReleased
is not true
kbry commented 4 years ago

is there any solution to screenshot a widget on the web

LeonWehrhahn commented 4 years ago

Also looking for a solution to take a screenshot of widgets on flutter web.

NickNevzorov commented 4 years ago

Also looking for a solution to take a screenshot of widgets on flutter web.

maheshj01 commented 4 years ago

I think this might help you this flutter example from @rxlabz allows you to save your canvas as a png image live on the web here and you can find the source code here

deakjahn commented 4 years ago

@maheshmnj with the slight problem, unfortunately, that it isn't a ui.Canvas but a html.CanvasElement. A horse of a different color...

deakjahn commented 4 years ago

@yjbanov Yegor, judging by the labels and commits, you might be the most active player in this area. :-)

I have identified and collected four errors (some actually fork into two being different problems on DomCanvas and CanvasKit) that, although separate errors, all belong to the same group of picture manipulation, this one being one of them. All of them are such showstoppers for me that I started to delve into the engine, trying to fix myself. (All of them are reported here, by the way.)

Just to recap:

Is there any way to have a few messages about these (eg. I think Ifound what's actually missing for the first to work but I don't know if it would be ever included or replaced with another functionality on the web), maybe out of band? Just to see if these (or anything that lies behind these errors) are being worked on actively and if there's anything to be had by us trying to work on them, too.

deakjahn commented 4 years ago

@yjbanov I fixed the first problem, Picture/Canvas toImage() already works for me. The required changes are rather simple, a few lines here and there. In CanvasKit, it seems just perfect, in DomCanvas I had to remove something that you might need in other scenarios (there is a comment to that effect). I'm actually only really interested in CanvasKit now but I wanted to take care of the other one, too.

I'll move on with the second problem but it would be nice to be able to show you the fix.

darshankawar commented 3 years ago

Verified and replicable on latest master and get below error message:

error log ``` Error: Assertion failed: org-dartlang-sdk:///flutter_web_sdk/lib/_engine/engine/html/scene_builder.dart:92:16 matrix4[0] == window.devicePixelRatio && matrix4[5] == window.devicePixelRatio is not true at Object.throw_ [as throw] (http://localhost:64329/dart_sdk.js:4351:11) at Object.assertFailed (http://localhost:64329/dart_sdk.js:4294:15) at _engine.SurfaceSceneBuilder.new.pushTransform (http://localhost:64329/dart_sdk.js:158855:133) at layer$.OffsetLayer.new.toImage (http://localhost:64329/packages/flutter/src/rendering/layer.dart.lib.js:1633:17) at toImage.next () at runBody (http://localhost:64329/dart_sdk.js:37988:34) at Object._async [as async] (http://localhost:64329/dart_sdk.js:38019:7) at layer$.OffsetLayer.new.toImage (http://localhost:64329/packages/flutter/src/rendering/layer.dart.lib.js:1627:20) at proxy_box.RenderRepaintBoundary.new.toImage (http://localhost:64329/packages/flutter/src/rendering/proxy_box.dart.lib.js:3355:26) at main._PngHomeState.new._capturePng (http://localhost:64329/packages/webtest/main.dart.lib.js:286:37) at _capturePng.next () at runBody (http://localhost:64329/dart_sdk.js:37988:34) at Object._async [as async] (http://localhost:64329/dart_sdk.js:38019:7) at main._PngHomeState.new.[_capturePng] (http://localhost:64329/packages/webtest/main.dart.lib.js:284:20) at ink_well._InkResponseState.new.[_handleTap] (http://localhost:64329/packages/flutter/src/material/icon_button.dart.lib.js:51063:42) at tap.TapGestureRecognizer.new.invokeCallback (http://localhost:64329/packages/flutter/src/gestures/recognizer.dart.lib.js:189:18) at tap.TapGestureRecognizer.new.handleTapUp (http://localhost:64329/packages/flutter/src/gestures/tap.dart.lib.js:395:40) at tap.TapGestureRecognizer.new.[_checkUp] (http://localhost:64329/packages/flutter/src/gestures/tap.dart.lib.js:201:12) at tap.TapGestureRecognizer.new.handlePrimaryPointer (http://localhost:64329/packages/flutter/src/gestures/tap.dart.lib.js:148:23) at tap.TapGestureRecognizer.new.handleEvent (http://localhost:64329/packages/flutter/src/gestures/recognizer.dart.lib.js:448:16) at pointer_router.PointerRouter.new.[_dispatch] (http://localhost:64329/packages/flutter/src/gestures/pointer_router.dart.lib.js:74:9) at http://localhost:64329/packages/flutter/src/gestures/pointer_router.dart.lib.js:109:26 at LinkedMap.new.forEach (http://localhost:64329/dart_sdk.js:25093:11) at pointer_router.PointerRouter.new.[_dispatchEventToRoutes] (http://localhost:64329/packages/flutter/src/gestures/pointer_router.dart.lib.js:106:29) at pointer_router.PointerRouter.new.route (http://localhost:64329/packages/flutter/src/gestures/pointer_router.dart.lib.js:98:37) at binding$5.WidgetsFlutterBinding.new.handleEvent (http://localhost:64329/packages/flutter/src/gestures/binding.dart.lib.js:314:26) at binding$5.WidgetsFlutterBinding.new.dispatchEvent (http://localhost:64329/packages/flutter/src/gestures/binding.dart.lib.js:297:24) at binding$5.WidgetsFlutterBinding.new.dispatchEvent (http://localhost:64329/packages/flutter/src/rendering/layer.dart.lib.js:6093:13) at binding$5.WidgetsFlutterBinding.new.[_handlePointerEventImmediately] (http://localhost:64329/packages/flutter/src/gestures/binding.dart.lib.js:268:14) at binding$5.WidgetsFlutterBinding.new.handlePointerEvent (http://localhost:64329/packages/flutter/src/gestures/binding.dart.lib.js:241:43) at binding$5.WidgetsFlutterBinding.new.[_flushPointerEventQueue] (http://localhost:64329/packages/flutter/src/gestures/binding.dart.lib.js:230:14) at binding$5.WidgetsFlutterBinding.new.[_handlePointerDataPacket] (http://localhost:64329/packages/flutter/src/gestures/binding.dart.lib.js:220:65) at Object.invoke1 (http://localhost:64329/dart_sdk.js:178716:7) at _engine.EnginePlatformDispatcher.__.invokeOnPointerDataPacket (http://localhost:64329/dart_sdk.js:161367:15) at _engine.PointerBinding.__.[_onPointerData] (http://localhost:64329/dart_sdk.js:162002:49) at http://localhost:64329/dart_sdk.js:162435:26 at http://localhost:64329/dart_sdk.js:162394:16 at http://localhost:64329/dart_sdk.js:162102:11 ```
flutter doctor -v ``` [✓] Flutter (Channel master, 1.25.0-5.0.pre.45, on Mac OS X 10.15.4 19E2269 darwin-x64, locale en-IN) • Flutter version 1.25.0-5.0.pre.45 at /Users/dhs/documents/Fluttersdk/flutter • Framework revision 81e1f7d1ed (10 hours ago), 2020-12-02 17:19:57 -0800 • Engine revision 20caf54969 • Dart version 2.12.0 (build 2.12.0-76.0.dev) [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0) • Android SDK at /Users/dhs/Library/Android/sdk • Platform android-30, build-tools 30.0.0 • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 12.0.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 12.0.1, Build version 12A7300 • CocoaPods version 1.9.3 [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome [✓] Android Studio (version 4.0) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin version 46.0.2 • Dart plugin version 193.7361 • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b3-6222593) [✓] VS Code (version 1.51.1) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.16.0 [✓] Connected device (5 available) • sdk gphone x86 arm (mobile) • emulator-5554 • android-x86 • Android 11 (API 30) (emulator) • iPhone SE (2nd generation) (mobile) • 6C85835D-FBFD-4AB3-8DE8-B4FAD35E5367 • ios • com.apple.CoreSimulator.SimRuntime.iOS-14-0 (simulator) • macOS (desktop) • macos • darwin-x64 • Mac OS X 10.15.4 19E2269 darwin-x64 • Web Server (web) • web-server • web-javascript • Flutter Tools • Chrome (web) • chrome • web-javascript • Google Chrome 87.0.4280.88 • No issues found! ```
BytesZero commented 2 years ago

https://github.com/flutter/photobooth I think this is a good example

image

danagbemava-nc commented 6 months ago

Reproducible on the latest versions of flutter.

code sample ```dart import 'dart:typed_data'; import 'dart:ui' as ui; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { GlobalKey globalKey = GlobalKey(); void _incrementCounter() async { RenderRepaintBoundary boundary = globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary; ui.Image image = await boundary.toImage(pixelRatio: 1); ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png); Uint8List? pngBytes = byteData?.buffer.asUint8List(); print('PNG Image size: ${pngBytes?.length}'); } @override Widget build(BuildContext context) { return RepaintBoundary( key: globalKey, child: Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: const Center( child: Text('Some text'), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: const Icon(Icons.add), ), ), ); } } ```
Error: Assertion failed: org-dartlang-sdk:///lib/_engine/engine/html/scene_builder.dart:94:16
matrix4[0] == EngineFlutterDisplay.instance.devicePixelRatio &&
            matrix4[5] == EngineFlutterDisplay.instance.devicePixelRatio
is not true
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 296:3       throw_
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 29:3        assertFailed
lib/_engine/engine/html/scene_builder.dart 95:57                                  pushTransform
packages/flutter/src/rendering/layer.dart 1525:12                                 [_createSceneForImage]
packages/flutter/src/rendering/layer.dart 1549:28                                 toImage
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54                runBody
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5                _async
packages/flutter/src/rendering/layer.dart 1548:27                                 toImage
packages/flutter/src/rendering/proxy_box.dart 3357:23                             toImage
packages/xst/main.dart 42:38                                                      _incrementCounter
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54                runBody
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5                _async
packages/xst/main.dart 39:25                                                      [_incrementCounter]
packages/flutter/src/material/ink_well.dart 1171:21                               handleTap
packages/flutter/src/gestures/recognizer.dart 315:24                              invokeCallback
packages/flutter/src/gestures/tap.dart 652:11                                     handleTapUp
packages/flutter/src/gestures/tap.dart 309:5                                      [_checkUp]
packages/flutter/src/gestures/tap.dart 242:7                                      handlePrimaryPointer
packages/flutter/src/gestures/recognizer.dart 667:9                               handleEvent
packages/flutter/src/gestures/pointer_router.dart 98:7                            [_dispatch]
packages/flutter/src/gestures/pointer_router.dart 143:9                           <fn>
dart-sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart 21:7           forEach
packages/flutter/src/gestures/pointer_router.dart 141:17                          [_dispatchEventToRoutes]
packages/flutter/src/gestures/pointer_router.dart 127:7                           route
packages/flutter/src/gestures/binding.dart 495:5                                  handleEvent
packages/flutter/src/gestures/binding.dart 475:14                                 dispatchEvent
packages/flutter/src/rendering/binding.dart 425:11                                dispatchEvent
packages/flutter/src/gestures/binding.dart 420:7                                  [_handlePointerEventImmediately]
packages/flutter/src/gestures/binding.dart 383:5                                  handlePointerEvent
packages/flutter/src/gestures/binding.dart 330:7                                  [_flushPointerEventQueue]
packages/flutter/src/gestures/binding.dart 299:9                                  [_handlePointerDataPacket]
lib/_engine/engine/platform_dispatcher.dart 1418:5                                invoke1
lib/_engine/engine/platform_dispatcher.dart 332:5                                 invokeOnPointerDataPacket
lib/_engine/engine/pointer_binding.dart 398:30                                    [_sendToFramework]
lib/_engine/engine/pointer_binding.dart 224:7                                     onPointerData
lib/_engine/engine/pointer_binding.dart 1001:20                                   <fn>
lib/_engine/engine/pointer_binding.dart 930:7                                     <fn>
lib/_engine/engine/pointer_binding.dart 531:9                                     loggedHandler
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 426:37  _checkAndCall
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/operations.dart 431:39  dcall
flutter doctor -v ``` [✓] Flutter (Channel stable, 3.19.2, on macOS 14.3.1 23D60 darwin-arm64, locale en-GB) • Flutter version 3.19.2 on channel stable at /Users/nexus/dev/sdks/flutter • Upstream repository https://github.com/flutter/flutter.git • Framework revision 7482962148 (7 days ago), 2024-02-27 16:51:22 -0500 • Engine revision 04817c99c9 • Dart version 3.3.0 • DevTools version 2.31.1 [✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0) • Android SDK at /Users/nexus/Library/Android/sdk • Platform android-34, build-tools 34.0.0 • Java binary at: /Users/nexus/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 15.2) • Xcode at /Applications/Xcode-15.2.0.app/Contents/Developer • Build 15C500b • CocoaPods version 1.14.3 [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome [✓] Android Studio (version 2023.1) • Android Studio at /Users/nexus/Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314) [✓] IntelliJ IDEA Ultimate Edition (version 2023.2.5) • IntelliJ at /Users/nexus/Applications/IntelliJ IDEA Ultimate.app • Flutter plugin version 77.2.2 • Dart plugin version 232.10286 [✓] VS Code (version 1.86.2) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.84.0 [✓] Connected device (5 available) • Pixel 7 (mobile) • 28291FDH2001SA • android-arm64 • Android 14 (API 34) • Nexus (mobile) • 00008020-001875E83A38002E • ios • iOS 17.3.1 21D61 • Dean’s iPad (mobile) • 00008103-000825C811E3401E • ios • iOS 17.3.1 21D61 • macOS (desktop) • macos • darwin-arm64 • macOS 14.3.1 23D60 darwin-arm64 • Chrome (web) • chrome • web-javascript • Google Chrome 122.0.6261.94 [✓] Network resources • All expected network resources are available. • No issues found! ``` ``` [!] Flutter (Channel master, 3.20.0-17.0.pre.77, on macOS 14.3.1 23D60 darwin-arm64, locale en-GB) • Flutter version 3.20.0-17.0.pre.77 on channel master at /Users/nexus/dev/sdks/flutters ! Warning: `flutter` on your path resolves to /Users/nexus/dev/sdks/flutter/bin/flutter, which is not inside your current Flutter SDK checkout at /Users/nexus/dev/sdks/flutters. Consider adding /Users/nexus/dev/sdks/flutters/bin to the front of your path. ! Warning: `dart` on your path resolves to /Users/nexus/dev/sdks/flutter/bin/dart, which is not inside your current Flutter SDK checkout at /Users/nexus/dev/sdks/flutters. Consider adding /Users/nexus/dev/sdks/flutters/bin to the front of your path. • Upstream repository https://github.com/flutter/flutter.git • Framework revision e73e7e2e56 (9 hours ago), 2024-03-04 19:01:40 -0800 • Engine revision d514a302cd • Dart version 3.4.0 (build 3.4.0-190.0.dev) • DevTools version 2.33.1 • If those were intentional, you can disregard the above warnings; however it is recommended to use "git" directly to perform update checks and upgrades. [✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0) • Android SDK at /Users/nexus/Library/Android/sdk • Platform android-34, build-tools 34.0.0 • Java binary at: /Users/nexus/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314) • All Android licenses accepted. [✓] Xcode - develop for iOS and macOS (Xcode 15.2) • Xcode at /Applications/Xcode-15.2.0.app/Contents/Developer • Build 15C500b • CocoaPods version 1.14.3 [✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome [✓] Android Studio (version 2023.1) • Android Studio at /Users/nexus/Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 17.0.7+0-17.0.7b1000.6-10550314) [✓] IntelliJ IDEA Ultimate Edition (version 2023.2.5) • IntelliJ at /Users/nexus/Applications/IntelliJ IDEA Ultimate.app • Flutter plugin version 77.2.2 • Dart plugin version 232.10286 [✓] VS Code (version 1.86.2) • VS Code at /Applications/Visual Studio Code.app/Contents • Flutter extension version 3.84.0 [✓] Connected device (6 available) • Pixel 7 (mobile) • 28291FDH2001SA • android-arm64 • Android 14 (API 34) • Nexus (mobile) • 00008020-001875E83A38002E • ios • iOS 17.3.1 21D61 • Dean’s iPad (mobile) • 00008103-000825C811E3401E • ios • iOS 17.3.1 21D61 • macOS (desktop) • macos • darwin-arm64 • macOS 14.3.1 23D60 darwin-arm64 • Mac Designed for iPad (desktop) • mac-designed-for-ipad • darwin • macOS 14.3.1 23D60 darwin-arm64 • Chrome (web) • chrome • web-javascript • Google Chrome 122.0.6261.94 [✓] Network resources • All expected network resources are available. ! Doctor found issues in 1 category. ```