Allow flutter web to be compiled with flutter (#32360)
diff --git a/examples/flutter_gallery/lib/main_web.dart b/examples/flutter_gallery/lib/main_web.dart
new file mode 100644
index 0000000..f53fa2c
--- /dev/null
+++ b/examples/flutter_gallery/lib/main_web.dart
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Thanks for checking out Flutter!
+// Like what you see? Tweet us @FlutterDev
+
+import 'dart:ui' as ui;
+
+import 'package:flutter/material.dart';
+import 'gallery/app.dart';
+
+Future<void> main() async {
+ await ui.webOnlyInitializePlatform(); // ignore: undefined_function
+ runApp(const GalleryApp());
+}
diff --git a/examples/flutter_gallery/web/index.html b/examples/flutter_gallery/web/index.html
new file mode 100644
index 0000000..ba23294
--- /dev/null
+++ b/examples/flutter_gallery/web/index.html
@@ -0,0 +1,12 @@
+<!-- Copyright 2019 The Chromium Authors. All rights reserved.
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Flutter Gallery</title>
+ </head>
+ <body>
+ <script src="main.dart.js"></script>
+ </body>
+</html>
\ No newline at end of file
diff --git a/packages/flutter/lib/src/foundation/platform.dart b/packages/flutter/lib/src/foundation/platform.dart
index a9b199f..aaf6529 100644
--- a/packages/flutter/lib/src/foundation/platform.dart
+++ b/packages/flutter/lib/src/foundation/platform.dart
@@ -49,16 +49,22 @@
// and we'd never be able to introduce dedicated behavior for that platform
// (since doing so would be a big breaking change).
TargetPlatform get defaultTargetPlatform {
+ // TODO(jonahwilliams): consider where this constant should live.
+ const bool kIsWeb = identical(1, 1.0);
TargetPlatform result;
- if (Platform.isIOS) {
- result = TargetPlatform.iOS;
- } else if (Platform.isAndroid) {
+ if (kIsWeb) {
result = TargetPlatform.android;
- } else if (Platform.isFuchsia) {
- result = TargetPlatform.fuchsia;
+ } else {
+ if (Platform.isIOS) {
+ result = TargetPlatform.iOS;
+ } else if (Platform.isAndroid) {
+ result = TargetPlatform.android;
+ } else if (Platform.isFuchsia) {
+ result = TargetPlatform.fuchsia;
+ }
}
assert(() {
- if (Platform.environment.containsKey('FLUTTER_TEST'))
+ if (!kIsWeb && Platform.environment.containsKey('FLUTTER_TEST'))
result = TargetPlatform.android;
return true;
}());
diff --git a/packages/flutter_tools/lib/src/web/web_device.dart b/packages/flutter_tools/lib/src/web/web_device.dart
index 3d3a1ba..0c6905b 100644
--- a/packages/flutter_tools/lib/src/web/web_device.dart
+++ b/packages/flutter_tools/lib/src/web/web_device.dart
@@ -3,6 +3,8 @@
// found in the LICENSE file.
import '../application_package.dart';
+import '../asset.dart';
+import '../base/common.dart';
import '../base/context.dart';
import '../base/file_system.dart';
import '../base/io.dart';
@@ -10,6 +12,7 @@
import '../base/platform.dart';
import '../base/process_manager.dart';
import '../build_info.dart';
+import '../bundle.dart';
import '../device.dart';
import '../globals.dart';
import '../project.dart';
@@ -111,6 +114,13 @@
printError('Failed to compile ${package.name} to JavaScript');
return LaunchResult.failed();
}
+ final AssetBundle assetBundle = AssetBundleFactory.instance.createBundle();
+ final int build = await assetBundle.build();
+ if (build != 0) {
+ throwToolExit('Error: Failed to build asset bundle');
+ }
+ await writeBundle(fs.directory(getAssetBuildDirectory()), assetBundle.entries);
+
_package = package;
_server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
_server.listen(_basicAssetServer);
@@ -141,7 +151,7 @@
await request.response.close();
return;
}
- // Resolve all get requests to the build/web/asset directory.
+ // Resolve all get requests to the build/web/ or build/flutter_assets directory.
final Uri uri = request.uri;
File file;
String contentType;
@@ -152,8 +162,9 @@
file = fs.file(fs.path.join(getWebBuildDirectory(), 'main.dart.js'));
contentType = 'text/javascript';
} else {
- file = fs.file(fs.path.join(getAssetBuildDirectory(), uri.path));
+ file = fs.file(fs.path.join(getAssetBuildDirectory(), uri.path.replaceFirst('/assets/', '')));
}
+
if (!file.existsSync()) {
request.response.statusCode = HttpStatus.notFound;
await request.response.close();
@@ -201,7 +212,7 @@
Future<void> launch(String host) async {
if (platform.isMacOS) {
- await processManager.start(<String>[
+ return processManager.start(<String>[
_kMacosLocation,
host,
]);