Introducing Flutter
Google Developers
-Get started at https://flutter.io today.
+Get started at https://flutter.dev today.
-Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.
+Flutter is Google's mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.
VIDEO
diff --git a/demo_app/macos/Podfile.lock b/demo_app/macos/Podfile.lock
index 82eaf4fb2..7f3d6df3d 100644
--- a/demo_app/macos/Podfile.lock
+++ b/demo_app/macos/Podfile.lock
@@ -2,9 +2,6 @@ PODS:
- audio_session (0.0.1):
- FlutterMacOS
- FlutterMacOS (1.0.0)
- - FMDB (2.7.5):
- - FMDB/standard (= 2.7.5)
- - FMDB/standard (2.7.5)
- just_audio (0.0.1):
- FlutterMacOS
- package_info_plus (0.0.1):
@@ -12,9 +9,9 @@ PODS:
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- - sqflite (0.0.2):
+ - sqflite (0.0.3):
+ - Flutter
- FlutterMacOS
- - FMDB (>= 2.7.5)
- url_launcher_macos (0.0.1):
- FlutterMacOS
- video_player_avfoundation (0.0.1):
@@ -29,15 +26,11 @@ DEPENDENCIES:
- just_audio (from `Flutter/ephemeral/.symlinks/plugins/just_audio/macos`)
- package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`)
- path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`)
- - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/macos`)
+ - sqflite (from `Flutter/ephemeral/.symlinks/plugins/sqflite/darwin`)
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
- video_player_avfoundation (from `Flutter/ephemeral/.symlinks/plugins/video_player_avfoundation/darwin`)
- wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`)
-SPEC REPOS:
- trunk:
- - FMDB
-
EXTERNAL SOURCES:
audio_session:
:path: Flutter/ephemeral/.symlinks/plugins/audio_session/macos
@@ -50,7 +43,7 @@ EXTERNAL SOURCES:
path_provider_foundation:
:path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin
sqflite:
- :path: Flutter/ephemeral/.symlinks/plugins/sqflite/macos
+ :path: Flutter/ephemeral/.symlinks/plugins/sqflite/darwin
url_launcher_macos:
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
video_player_avfoundation:
@@ -61,13 +54,12 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
audio_session: dea1f41890dbf1718f04a56f1d6150fd50039b72
FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24
- FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
just_audio: 9b67ca7b97c61cfc9784ea23cd8cc55eb226d489
package_info_plus: 02d7a575e80f194102bef286361c6c326e4c29ce
- path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
- sqflite: a5789cceda41d54d23f31d6de539d65bb14100ea
+ path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
+ sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
url_launcher_macos: d2691c7dd33ed713bf3544850a623080ec693d95
- video_player_avfoundation: e9e6f9cae7d7a6d9b43519b0aab382bca60fcfd1
+ video_player_avfoundation: 02011213dab73ae3687df27ce441fbbcc82b5579
wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269
PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
diff --git a/demo_app/macos/Runner.xcodeproj/project.pbxproj b/demo_app/macos/Runner.xcodeproj/project.pbxproj
index d81ab3839..837b47387 100644
--- a/demo_app/macos/Runner.xcodeproj/project.pbxproj
+++ b/demo_app/macos/Runner.xcodeproj/project.pbxproj
@@ -27,8 +27,8 @@
33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; };
33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; };
33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; };
- 7F60517F14681FB88CA8285D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5278E5633825673A48D19B43 /* Pods_Runner.framework */; };
- F0BA5FDF4A7AB299CF61AFCF /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0C3332915F37692F48F0F7 /* Pods_RunnerTests.framework */; };
+ 4AD29B0ADD889BDC533E54BC /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D38B8E46EA9B6145B234C91F /* Pods_RunnerTests.framework */; };
+ D4227722E97A67FFD2281E5D /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2361EFBAF42FE70FE1760475 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -62,9 +62,8 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 1A0C3332915F37692F48F0F7 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 1D48FE217AAA6B7853DB58C2 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
- 2DD07C3601BC34B506F6C898 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 1D0F5CB573178D113AE65D29 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ 2361EFBAF42FE70FE1760475 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
@@ -81,13 +80,14 @@
33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; };
33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; };
33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; };
- 3FED3604C1027FF8E8F47A36 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
- 5278E5633825673A48D19B43 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
- 6DB3E8DC72334C067A0023DC /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
- 75E003EC51AF3F9424C48EEF /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ 5DA36FEA48E05B8865ED3A74 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+ 6F8746C86E421A96A9128F53 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
- A444D0ECA8D74B3318BA8C17 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ B6F567335FAF3C6DA5B8C90C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ BA2071868D3CABF9522E4BEB /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ D38B8E46EA9B6145B234C91F /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ EA37EC409D07CB2DDD42F212 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -95,7 +95,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- F0BA5FDF4A7AB299CF61AFCF /* Pods_RunnerTests.framework in Frameworks */,
+ 4AD29B0ADD889BDC533E54BC /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -103,7 +103,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 7F60517F14681FB88CA8285D /* Pods_Runner.framework in Frameworks */,
+ D4227722E97A67FFD2281E5D /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -137,7 +137,7 @@
331C80D6294CF71000263BE5 /* RunnerTests */,
33CC10EE2044A3C60003C045 /* Products */,
D73912EC22F37F3D000D13A0 /* Frameworks */,
- C1A83EAEED9B0FE7F5A7E0DB /* Pods */,
+ EB2E1E32FCE03D0EC4DC6BED /* Pods */,
);
sourceTree = "";
};
@@ -185,27 +185,27 @@
path = Runner;
sourceTree = "";
};
- C1A83EAEED9B0FE7F5A7E0DB /* Pods */ = {
+ D73912EC22F37F3D000D13A0 /* Frameworks */ = {
isa = PBXGroup;
children = (
- A444D0ECA8D74B3318BA8C17 /* Pods-Runner.debug.xcconfig */,
- 2DD07C3601BC34B506F6C898 /* Pods-Runner.release.xcconfig */,
- 3FED3604C1027FF8E8F47A36 /* Pods-Runner.profile.xcconfig */,
- 6DB3E8DC72334C067A0023DC /* Pods-RunnerTests.debug.xcconfig */,
- 1D48FE217AAA6B7853DB58C2 /* Pods-RunnerTests.release.xcconfig */,
- 75E003EC51AF3F9424C48EEF /* Pods-RunnerTests.profile.xcconfig */,
+ 2361EFBAF42FE70FE1760475 /* Pods_Runner.framework */,
+ D38B8E46EA9B6145B234C91F /* Pods_RunnerTests.framework */,
);
- name = Pods;
- path = Pods;
+ name = Frameworks;
sourceTree = "";
};
- D73912EC22F37F3D000D13A0 /* Frameworks */ = {
+ EB2E1E32FCE03D0EC4DC6BED /* Pods */ = {
isa = PBXGroup;
children = (
- 5278E5633825673A48D19B43 /* Pods_Runner.framework */,
- 1A0C3332915F37692F48F0F7 /* Pods_RunnerTests.framework */,
+ BA2071868D3CABF9522E4BEB /* Pods-Runner.debug.xcconfig */,
+ EA37EC409D07CB2DDD42F212 /* Pods-Runner.release.xcconfig */,
+ 5DA36FEA48E05B8865ED3A74 /* Pods-Runner.profile.xcconfig */,
+ 1D0F5CB573178D113AE65D29 /* Pods-RunnerTests.debug.xcconfig */,
+ 6F8746C86E421A96A9128F53 /* Pods-RunnerTests.release.xcconfig */,
+ B6F567335FAF3C6DA5B8C90C /* Pods-RunnerTests.profile.xcconfig */,
);
- name = Frameworks;
+ name = Pods;
+ path = Pods;
sourceTree = "";
};
/* End PBXGroup section */
@@ -215,7 +215,7 @@
isa = PBXNativeTarget;
buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
- 4BEDA540330E036C4564FA86 /* [CP] Check Pods Manifest.lock */,
+ 3F7248E32F0BA97A06C05EA2 /* [CP] Check Pods Manifest.lock */,
331C80D1294CF70F00263BE5 /* Sources */,
331C80D2294CF70F00263BE5 /* Frameworks */,
331C80D3294CF70F00263BE5 /* Resources */,
@@ -234,13 +234,13 @@
isa = PBXNativeTarget;
buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
- F7A938853D40701B31C12E84 /* [CP] Check Pods Manifest.lock */,
+ 2B4E37A043A773F719286135 /* [CP] Check Pods Manifest.lock */,
33CC10E92044A3C60003C045 /* Sources */,
33CC10EA2044A3C60003C045 /* Frameworks */,
33CC10EB2044A3C60003C045 /* Resources */,
33CC110E2044A8840003C045 /* Bundle Framework */,
3399D490228B24CF009A79C7 /* ShellScript */,
- DBD513ED9951103B48A00A61 /* [CP] Embed Pods Frameworks */,
+ 4FDCA18F9277BA16677C8403 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@@ -258,8 +258,9 @@
33CC10E52044A3C60003C045 /* Project object */ = {
isa = PBXProject;
attributes = {
+ BuildIndependentTargetsInParallel = YES;
LastSwiftUpdateCheck = 0920;
- LastUpgradeCheck = 1430;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C80D4294CF70F00263BE5 = {
@@ -322,6 +323,28 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
+ 2B4E37A043A773F719286135 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
3399D490228B24CF009A79C7 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -360,7 +383,7 @@
shellPath = /bin/sh;
shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire";
};
- 4BEDA540330E036C4564FA86 /* [CP] Check Pods Manifest.lock */ = {
+ 3F7248E32F0BA97A06C05EA2 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -382,7 +405,7 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
- DBD513ED9951103B48A00A61 /* [CP] Embed Pods Frameworks */ = {
+ 4FDCA18F9277BA16677C8403 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -399,28 +422,6 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
- F7A938853D40701B31C12E84 /* [CP] Check Pods Manifest.lock */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
- "${PODS_ROOT}/Manifest.lock",
- );
- name = "[CP] Check Pods Manifest.lock";
- outputFileListPaths = (
- );
- outputPaths = (
- "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
- showEnvVarsInLog = 0;
- };
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -472,7 +473,7 @@
/* Begin XCBuildConfiguration section */
331C80DB294CF71000263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 6DB3E8DC72334C067A0023DC /* Pods-RunnerTests.debug.xcconfig */;
+ baseConfigurationReference = 1D0F5CB573178D113AE65D29 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -487,7 +488,7 @@
};
331C80DC294CF71000263BE5 /* Release */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 1D48FE217AAA6B7853DB58C2 /* Pods-RunnerTests.release.xcconfig */;
+ baseConfigurationReference = 6F8746C86E421A96A9128F53 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -502,7 +503,7 @@
};
331C80DD294CF71000263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
- baseConfigurationReference = 75E003EC51AF3F9424C48EEF /* Pods-RunnerTests.profile.xcconfig */;
+ baseConfigurationReference = B6F567335FAF3C6DA5B8C90C /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CURRENT_PROJECT_VERSION = 1;
@@ -520,6 +521,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -543,9 +545,11 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -593,6 +597,7 @@
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -616,9 +621,11 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -646,6 +653,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@@ -669,9 +677,11 @@
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CODE_SIGN_IDENTITY = "-";
COPY_PHASE_STRIP = NO;
+ DEAD_CODE_STRIPPING = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
diff --git a/demo_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/demo_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index d4ade99b6..29acf5bfd 100644
--- a/demo_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/demo_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
=3.2.0 <4.0.0"
- flutter: ">=3.16.0"
+ dart: ">=3.3.0 <4.0.0"
+ flutter: ">=3.16.6"
diff --git a/packages/core/lib/src/widgets/html_list_marker.dart b/packages/core/lib/src/widgets/html_list_marker.dart
index 9c0f48b5d..ce5de1a8d 100644
--- a/packages/core/lib/src/widgets/html_list_marker.dart
+++ b/packages/core/lib/src/widgets/html_list_marker.dart
@@ -1,3 +1,5 @@
+// TODO: remove lint ignore when our minimum Flutter version >= 3.19
+// ignore: unnecessary_import
import 'dart:ui';
import 'package:flutter/rendering.dart';
diff --git a/packages/fwfh_webview/integration_test/js_interop_test.dart b/packages/fwfh_webview/integration_test/js_interop_test.dart
new file mode 100644
index 000000000..a5a9b6fc8
--- /dev/null
+++ b/packages/fwfh_webview/integration_test/js_interop_test.dart
@@ -0,0 +1,46 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:flutter_widget_from_html_core/flutter_widget_from_html_core.dart';
+import 'package:fwfh_webview/fwfh_webview.dart';
+import 'package:integration_test/integration_test.dart';
+import 'package:web/web.dart' as web;
+
+void main() {
+ IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+ testWidgets('IFRAME app', (WidgetTester tester) async {
+ runApp(const IframeApp());
+ await tester.pumpAndSettle();
+
+ final elements = web.document.getElementsByTagName('iframe');
+ expect(elements.length, 1);
+
+ for (var i = 0; i < elements.length; i++) {
+ final element = elements.item(i);
+ expect(element, isA());
+
+ final iframe = element! as web.HTMLIFrameElement;
+ expect(iframe.src, 'https://www.youtube.com/embed/jNQXAC9IVRw');
+ }
+ });
+}
+
+class IframeApp extends StatelessWidget {
+ const IframeApp({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ home: Scaffold(
+ body: Center(
+ child: HtmlWidget(
+ 'VIDEO ',
+ factoryBuilder: () => MyWidgetFactory(),
+ ),
+ ),
+ ),
+ );
+ }
+}
+
+class MyWidgetFactory extends WidgetFactory with WebViewFactory {}
diff --git a/packages/fwfh_webview/lib/src/external/dart_ui.dart b/packages/fwfh_webview/lib/src/external/dart_ui.dart
deleted file mode 100644
index bd1f8984c..000000000
--- a/packages/fwfh_webview/lib/src/external/dart_ui.dart
+++ /dev/null
@@ -1 +0,0 @@
-export 'dart_ui_fallback.dart' if (dart.library.html) 'dart_ui_html.dart';
diff --git a/packages/fwfh_webview/lib/src/external/dart_ui_fallback.dart b/packages/fwfh_webview/lib/src/external/dart_ui_fallback.dart
deleted file mode 100644
index 930b9e817..000000000
--- a/packages/fwfh_webview/lib/src/external/dart_ui_fallback.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// ignore: camel_case_types, avoid_classes_with_only_static_members
-class platformViewRegistry {
- /// TODO: remove this when it's no longer needed
- /// See https://github.com/flutter/flutter/issues/55000
- static void registerViewFactory(
- String viewTypeId,
- dynamic Function(int viewId) viewFactory,
- ) {}
-}
diff --git a/packages/fwfh_webview/lib/src/external/dart_ui_html.dart b/packages/fwfh_webview/lib/src/external/dart_ui_html.dart
deleted file mode 100644
index 69c06ee29..000000000
--- a/packages/fwfh_webview/lib/src/external/dart_ui_html.dart
+++ /dev/null
@@ -1 +0,0 @@
-export 'dart:ui';
diff --git a/packages/fwfh_webview/lib/src/web_view/html.dart b/packages/fwfh_webview/lib/src/web_view/js_interop.dart
similarity index 70%
rename from packages/fwfh_webview/lib/src/web_view/html.dart
rename to packages/fwfh_webview/lib/src/web_view/js_interop.dart
index c0a504f6e..19fcb8a0c 100644
--- a/packages/fwfh_webview/lib/src/web_view/html.dart
+++ b/packages/fwfh_webview/lib/src/web_view/js_interop.dart
@@ -1,20 +1,18 @@
-// ignore: avoid_web_libraries_in_flutter
-import 'dart:html' show IFrameElement;
+import 'dart:ui_web';
import 'package:flutter/widgets.dart';
+import 'package:web/web.dart';
-import '../external/dart_ui.dart' as ui;
import 'web_view.dart';
class WebViewState extends State {
- final _iframeElement = IFrameElement();
+ final _iframeElement = document.createElement('iframe') as HTMLIFrameElement;
late Widget _iframeWidget;
@override
void initState() {
super.initState();
- // ignore: unsafe_html
_iframeElement.src = widget.url;
_iframeElement.style.border = 'none';
@@ -24,8 +22,7 @@ class WebViewState extends State {
final viewType = '$this#$hashCode';
- ui.platformViewRegistry
- .registerViewFactory(viewType, (_) => _iframeElement);
+ platformViewRegistry.registerViewFactory(viewType, (_) => _iframeElement);
// TODO: switch to `webview_flutter_web` when it's endorsed
_iframeWidget = HtmlElementView(viewType: viewType);
diff --git a/packages/fwfh_webview/lib/src/web_view/web_view.dart b/packages/fwfh_webview/lib/src/web_view/web_view.dart
index 5a7368140..de7b585dd 100644
--- a/packages/fwfh_webview/lib/src/web_view/web_view.dart
+++ b/packages/fwfh_webview/lib/src/web_view/web_view.dart
@@ -2,7 +2,7 @@ import 'package:flutter/widgets.dart';
import 'fallback.dart'
if (dart.library.io) 'io.dart'
- if (dart.library.html) 'html.dart';
+ if (dart.library.js_interop) 'js_interop.dart';
/// An embedded web view.
class WebView extends StatefulWidget {
diff --git a/packages/fwfh_webview/lib/src/web_view_factory.dart b/packages/fwfh_webview/lib/src/web_view_factory.dart
index da4f30200..d128a0bac 100644
--- a/packages/fwfh_webview/lib/src/web_view_factory.dart
+++ b/packages/fwfh_webview/lib/src/web_view_factory.dart
@@ -139,7 +139,6 @@ mixin WebViewFactory on WidgetFactory {
},
),
);
- break;
}
return super.parse(meta);
}
diff --git a/packages/fwfh_webview/pubspec.yaml b/packages/fwfh_webview/pubspec.yaml
index df6f59277..436c844a8 100644
--- a/packages/fwfh_webview/pubspec.yaml
+++ b/packages/fwfh_webview/pubspec.yaml
@@ -4,14 +4,15 @@ description: WidgetFactory extension to render IFRAME with the official WebView
homepage: https://github.com/daohoangson/flutter_widget_from_html
environment:
- flutter: ">=3.7.0"
- sdk: ">=2.19.0 <4.0.0"
+ flutter: ">=3.16.0"
+ sdk: ">=3.2.0 <4.0.0"
dependencies:
flutter:
sdk: flutter
flutter_widget_from_html_core: ">=0.10.5 <0.15.0"
logging: ^1.0.0
+ web: ">=0.3.0 <0.6.0"
webview_flutter: ^4.0.1
webview_flutter_android: ^3.10.0
webview_flutter_wkwebview: ^3.6.0
@@ -23,6 +24,8 @@ dependency_overrides:
dev_dependencies:
flutter_test:
sdk: flutter
+ integration_test:
+ sdk: flutter
lint: any
measurer: ^2.1.1
plugin_platform_interface: any
diff --git a/packages/fwfh_webview/test/mock_webview_platform.dart b/packages/fwfh_webview/test/mock_webview_platform.dart
index b7494db8f..a9821888c 100644
--- a/packages/fwfh_webview/test/mock_webview_platform.dart
+++ b/packages/fwfh_webview/test/mock_webview_platform.dart
@@ -15,9 +15,7 @@ void mockWebViewPlatform() {
const codec = StandardMessageCodec();
final emptyList = codec.encodeMessage([]);
final messenger =
- // TODO: remove lint ignore when our minimum Flutter version >= 3.10
- // ignore: unnecessary_non_null_assertion
- TestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessenger;
+ TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger;
messenger.setMockMessageHandler(
'dev.flutter.pigeon.webview_flutter_android.InstanceManagerHostApi.clear',
(_) => Future.value(emptyList),
diff --git a/packages/fwfh_webview/test_driver/integration_test.dart b/packages/fwfh_webview/test_driver/integration_test.dart
new file mode 100644
index 000000000..b38629cca
--- /dev/null
+++ b/packages/fwfh_webview/test_driver/integration_test.dart
@@ -0,0 +1,3 @@
+import 'package:integration_test/integration_test_driver.dart';
+
+Future main() => integrationDriver();
diff --git a/tool/integration.sh b/tool/integration.sh
index d158bf48f..f85b420cf 100755
--- a/tool/integration.sh
+++ b/tool/integration.sh
@@ -4,7 +4,7 @@ set -euo pipefail
cd "$(dirname $(dirname ${BASH_SOURCE[0]}))"/demo_app
-if [ ! -z "$JAVA_HOME_17_X64" ]; then
+if [ ! -z ${JAVA_HOME_17_X64+x} ]; then
# switch to Java 17 in GitHub Actions
export JAVA_HOME=$JAVA_HOME_17_X64
echo "JAVA_HOME=$JAVA_HOME"
diff --git a/tool/test.sh b/tool/test.sh
index 6c16c9384..6f55fe2a6 100755
--- a/tool/test.sh
+++ b/tool/test.sh
@@ -53,6 +53,17 @@ if [ -z ${UPDATE_GOLDENS+x} ]; then
echo 'packages/fwfh_webview OK'
)
+ if [ ! -z ${CHROMEDRIVER_PORT_4444+x} ]; then
+ (
+ cd ./packages/fwfh_webview &&
+ flutter drive \
+ -d web-server \
+ --driver=test_driver/integration_test.dart \
+ --target=integration_test/js_interop_test.dart &&
+ echo 'packages/fwfh_webview JavaScript interop OK'
+ )
+ fi
+
(
cd ./packages/enhanced &&
flutter analyze &&
diff --git a/tool/update-demo_app-files.sh b/tool/update-demo_app-files.sh
index 9228db253..6c2da2f68 100755
--- a/tool/update-demo_app-files.sh
+++ b/tool/update-demo_app-files.sh
@@ -4,6 +4,9 @@ set -euo pipefail
cd "$(dirname $(dirname ${BASH_SOURCE[0]}))"/demo_app
+rm -rf android ios macos web
+rm -f pubspec.lock
+
flutter create --platforms android,ios,macos,web --project-name demo_app --org dev.fwfh .
flutter build ios --no-codesign
flutter build macos