Description
Note: This is shamelessly copied from https://stackoverflow.com/questions/59568536/how-to-include-a-webassembly-module-in-a-flutter-web-application because I think this is a bug/is missing documentation.
I'm trying to extend my Flutter Web application with some Rust code via WebAssembly. My project structure looks like this:
lib/
- main.dart
web/
- wasm_demo/
- src/
- lib.rs
- pkg/
- wasm_demo.js
- wasm_demo_bg.wasm
- bootstrap.js
- Cargo.toml
- index.html
The Rust code just creates a String
and returns it:
// web/wasm_demo/src/lib.rs
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn get_string() -> String {
String::from("This is a Rust String!")
}
When compiled with wasm-pack build
the bytecode ends up in web/wasm_demo/pkg/wasm_demo_bg.wasm
. wasm_demo.js
is just a JavaScript module exporting the get_string
function from wasm_demo_bg.wasm
:
import * as wasm from './wasm_demo_bg.wasm';
...
/**
* @returns {string}
*/
export function get_string() {
...
}
bootstrap.js
imports that module and puts it into the window
object:
// bootstrap.js
import * as wasm_demo from "./pkg/wasm_demo";
window.wasm_demo = wasm_demo;
index.html
loads that bootstrapper prior to launching the actual application:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Rust/WASM/Flutter interop demo</title>
</head>
<body>
<script src="wasm_demo/bootstrap.js" type="module"></script>
<script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
And finally, Flutter displays the Rust String
:
import 'dart:js';
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Rust/WASM/Flutter interop demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext buildContext) {
var rustString = context["wasm_demo"].callMethod('get_string').toString();
return Scaffold(
appBar: AppBar(
title: Text("Rust/WASM/Flutter interop demo"),
),
body: Center(
child: Text(rustString),
),
);
}
}
The problem I have is that wasm_demo_bg.wasm
is apparently not included in the bundle:
:44809/wasm_demo/pkg/wasm_demo:1 Failed to load resource: the server responded with a status of 404 (Not Found)
Is there any way to tell Flutter that the WebAssembly module is needed in the bundle? Thanks!
Steps to Reproduce
- Clone this: https://github.com/malte-v/flutter-rust-interop
- flutter run -d chrome
- See Chrome developer console
Target Platform: Web
Target OS version/browser: Google Chrome Version 78.0.3904.70
Devices: --
logs
➜ flutter-rust-interop git:(master) ✗ flutter run -d chrome --verbose
[ +12 ms] executing: [/opt/flutter/] git -c log.showSignature=false log -n 1 --pretty=format:%H
[ +20 ms] Exit code 0 from: git -c log.showSignature=false log -n 1 --pretty=format:%H
[ ] 1946fc4da0f80c522d7e3ae7d4f7309908ed86f2
[ ] executing: [/opt/flutter/] git describe --match v*.*.* --first-parent --long --tags
[ +5 ms] Exit code 0 from: git describe --match v*.*.* --first-parent --long --tags
[ ] v1.10.14-0-g1946fc4da
[ +4 ms] executing: [/opt/flutter/] git rev-parse --abbrev-ref --symbolic @{u}
[ +6 ms] Exit code 0 from: git rev-parse --abbrev-ref --symbolic @{u}
[ ] origin/dev
[ ] executing: [/opt/flutter/] git ls-remote --get-url origin
[ +5 ms] Exit code 0 from: git ls-remote --get-url origin
[ ] https://github.com/flutter/flutter.git
[ +33 ms] executing: [/opt/flutter/] git rev-parse --abbrev-ref HEAD
[ +6 ms] Exit code 0 from: git rev-parse --abbrev-ref HEAD
[ ] dev
[ +52 ms] executing: /opt/android-sdk/platform-tools/adb devices -l
[ +7 ms] Exit code 0 from: /opt/android-sdk/platform-tools/adb devices -l
[ ] List of devices attached
[ +12 ms] Artifact Instance of 'AndroidMavenArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'AndroidGenSnapshotArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'AndroidInternalBuildArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'IOSEngineArtifacts' is not required, skipping update.
[ +2 ms] Artifact Instance of 'WindowsEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxEngineArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'LinuxFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'MacOSFuchsiaSDKArtifacts' is not required, skipping update.
[ ] Artifact Instance of 'FlutterRunnerSDKArtifacts' is not required, skipping update.
[ +85 ms] Generating /home/malte/work/flutter-rust-interop/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java
[ +89 ms] Launching lib/main.dart on Chrome in debug mode...
[ ] Building application for the web...
[+7462 ms] Starting daemon...
[ +91 ms] Initializing inputs
[ +7 ms] Reading cached asset graph...
[ +144 ms] Reading cached asset graph completed, took 142ms
[ +161 ms] Checking for updates since last build...
[ +450 ms] Checking for updates since last build completed, took 450ms
[ +6 ms] Initializing inputs
[ +1 ms] Reading cached asset graph...
[ ] Reading cached asset graph completed, took 142ms
[ ] Checking for updates since last build...
[ ] Checking for updates since last build completed, took 450ms
[ +107 ms] Serving DevTools at http://127.0.0.1:37153
[ +588 ms] About to build [web]...
[ +2 ms] Running build...
[ +128 ms] Running build completed, took 55ms
[ ] Caching finalized dependency graph...
[ +6 ms] Caching finalized dependency graph completed, took 91ms
[ +12 ms] Succeeded after 160ms with 0 outputs (0 actions)
[ +5 ms] Building application for the web... (completed in 9.2s)
[ ] Attempting to connect to browser instance..
[+2725 ms] Failed to load asset at path: packages/build_web_compilers/src/dev_compiler/dart_sdk.js.
Status code: 404
Headers:
{
"date": "Fri, 03 Jan 2020 12:37:58 GMT",
"content-length": "9",
"x-frame-options": "SAMEORIGIN",
"content-type": "text/plain; charset=utf-8",
"x-xss-protection": "1; mode=block",
"x-content-type-options": "nosniff",
"server": "dart:io with Shelf",
"via": "1.1 shelf_proxy"
}
Content:
Not Found
[ +939 ms] Debug service listening on ws://127.0.0.1:46807/N1ysg6IiTLc=
[ +9 ms] Attempting to connect to browser instance.. (completed in 3.7s)
[ +1 ms] 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻
[ ] Warning: Flutter's support for building web applications is highly experimental.
[ ] For more information see https://github.com/flutter/flutter/issues/34082.
[ ] 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻 👻
[ ] 🔥 To hot restart (and rebuild state), press "r" or "R".
[ ] For a more detailed help message, press "h". To quit, press "q".
[ +4 ms] Debug service listening on ws://127.0.0.1:46807/N1ysg6IiTLc=
[ +571 ms] ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
[ +7 ms] The following NoSuchMethodError was thrown building MyHomePage(dirty):
[ ] 'callMethod'
[ ] Dynamic call of null.
[ ] Receiver: null
[ ] Arguments: ["get_string"]
[ +10 ms] User-created ancestor of the error-causing widget was:
[ ] MaterialApp org-dartlang-app:///packages/web_test/main.dart:13:12
[ ] When the exception was thrown, this was the stack:
[ ] package:build_web_compilers/src/dev_compiler/dart_sdk.js 3995:11 throw_
[ ] package:build_web_compilers/src/dev_compiler/dart_sdk.js 4410:15 defaultNoSuchMethod
[ ] package:build_web_compilers/src/dev_compiler/dart_sdk.js 4406:27 noSuchMethod
[ ] package:build_web_compilers/src/dev_compiler/dart_sdk.js 4161:19 callNSM
[ +4 ms] package:build_web_compilers/src/dev_compiler/dart_sdk.js 4163:27 _checkAndCall
[ ] package:build_web_compilers/src/dev_compiler/dart_sdk.js 4242:17 callMethod
[ ] package:build_web_compilers/src/dev_compiler/dart_sdk.js 4245:17 dsend
[ ] package:web_test/main.dart 26:43 build
[ ] package:flutter/src/widgets/framework.dart 4026:28 build
[ +9 ms] package:flutter/src/widgets/framework.dart 3958:15 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ +8 ms] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ +33 ms] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ +15 ms] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ +18 ms] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ +16 ms] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 5271:32 mount
[ +11 ms] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/overlay.dart 593:16 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ +11 ms] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ +10 ms] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ +988 ms] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ +2 ms] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ +4 ms] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ +3 ms] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 5165:14 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ +1 ms] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 4111:11 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/framework.dart 3978:16 performRebuild
[ ] package:flutter/src/widgets/framework.dart 3755:5 rebuild
[ ] package:flutter/src/widgets/framework.dart 3941:5 [_firstBuild]
[ ] package:flutter/src/widgets/framework.dart 3936:5 mount
[ ] package:flutter/src/widgets/framework.dart 3109:13 inflateWidget
[ ] package:flutter/src/widgets/framework.dart 2903:12 updateChild
[ ] package:flutter/src/widgets/binding.dart 1031:16 [_rebuild]
[ ] package:flutter/src/widgets/binding.dart 1002:5 mount
[ ] package:flutter/src/widgets/binding.dart 945:16 <fn>
[ ] package:flutter/src/widgets/framework.dart 2327:19 buildScope
[ ] package:flutter/src/widgets/binding.dart 944:12 attachToRenderTree
[ ] package:flutter/src/widgets/binding.dart 821:24 attachRootWidget
[ ] package:flutter/src/widgets/binding.dart 807:7 <fn>
[ ] package:build_web_compilers/src/dev_compiler/dart_sdk.js 28696:9 internalCallback
[ ] ════════════════════════════════════════════════════════════════════════════════════════════════════
➜ flutter-rust-interop git:(master) ✗ flutter analyze
Analyzing flutter-rust-interop...
No issues found! (ran in 1.2s)
➜ flutter-rust-interop git:(master) ✗ flutter doctor -v
[✓] Flutter (Channel dev, v1.10.14, on Linux, locale en_US.UTF-8)
• Flutter version 1.10.14 at /opt/flutter
• Framework revision 1946fc4da0 (3 months ago), 2019-10-07 15:23:31 -0700
• Engine revision 1d62160fdb
• Dart version 2.6.0 (build 2.6.0-dev.5.0 d6c6d12ebf)
[!] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
• Android SDK at /opt/android-sdk/
• Android NDK location not configured (optional; useful for native profiling support)
• Platform android-28, build-tools 28.0.3
• ANDROID_HOME = /opt/android-sdk
• Java binary at: /usr/bin/java
• Java version OpenJDK Runtime Environment (build 1.8.0_232-b09)
! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses
[✓] Chrome - develop for the web
• Chrome at google-chrome
[!] Android Studio (not installed)
• Android Studio not found; download from https://developer.android.com/studio/index.html
(or visit https://flutter.dev/setup/#android-setup for detailed instructions).
[✓] Connected device (2 available)
• Chrome • chrome • web-javascript • Google Chrome 78.0.3904.70
• Headless Server • headless-server • web-javascript • Flutter Tools
! Doctor found issues in 2 categories.