使用带有 Google 地图的两个屏幕返回应用程序时出现问题
Problems with returning to App using two Screens with Google Maps
Flutte google 贴图似乎是一个更严重的错误。是 #25653
的副本
8 月 8 日更新:当前进度:
试图用 Sukhi 修复错误,但他无法重现错误。我的同事们都能够重现它,但无法修复它:P。有没有其他人设法重现它?
还创建了 github repo with my code 并更新了 "what I tried so far"
8月5日更新,越来越接近真正的问题
问题的解释:
我的问题只发生在 IOs 和 真实设备(不是模拟器)上 调试 和 发布.
我确实使用带有一些标记的 google 地图小部件。点击标记打开另一个屏幕,其中包含更多信息、另一个 google 地图小部件以及通过 url 启动器导航的可能性。 (我减少了屏幕以仅显示导致问题的小部件)
离开该应用程序(例如点击开始导航或转到 IOs 主屏幕)然后返回该应用程序会导致问题。
如果我再次回到应用程序主屏幕,只会显示白屏。
加法:
在 Flex 小部件(列或行)的信息屏幕中包装 Google 地图小部件甚至会导致更糟糕的行为。返回到应用程序主屏幕时,Flex 小部件的其他内容(例如带有文本的容器)将保持可见。
到目前为止我尝试让它工作但没有工作:
- 发布模式=>同样的问题
- 禁用导航转换(like this)
- 异步等待url启动
- 基于 IOs 12.3 和 12.4
- 在 Future Builder 中构建地图小部件
重现步骤:
安装google_maps_flutter 0.5.20+1 and url_launcher: 5.0.3(我知道这不是最新的,但这不是问题所在)
在 flutter 项目中复制 CodeSnippet 并在 IOs.
上构建
点击标记
- 点击按钮 "Start Navigation" 或离开应用程序
- 点击左上角的苹果地图重定向到应用程序或重新打开应用程序
- 回到信息屏幕,点击左上角的左箭头
- 只能看到白屏
代码:
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:url_launcher/url_launcher.dart';
import 'dart:io';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: "/",
routes: {
"/": (context) => HomePage(),
},
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: GoogleMap(
initialCameraPosition: CameraPosition(
target: const LatLng(47.6, 8.8796),
zoom: 7,
),
markers: Set<Marker>()
..add(
Marker(
markerId: MarkerId('hi'),
position: LatLng(47.6, 8.8796),
consumeTapEvents: true,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => InfoScreen()),
);
},
),
),
),
);
}
}
class InfoScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("info Page"),),
body: GoogleMap(
initialCameraPosition: CameraPosition(
target: const LatLng(47.6, 8.8796),
zoom: 7,
),
markers: Set<Marker>()
..add(
Marker(
markerId: MarkerId('hi2'),
consumeTapEvents: true,
position: LatLng(47.6, 8.8796),
onTap: () {
if (Platform.isIOS) {
launch('https://maps.apple.com/?q=47.6,8.8796');
} else {
launch(
'https://www.google.com/maps/search/?api=1&query=47.6,8.8796');
}
},
),
),
),
bottomNavigationBar: BottomAppBar(
elevation: 0,
child: Container(
padding: const EdgeInsets.symmetric(vertical: 19, horizontal: 25),
height: 80,
child: InkWell(
onTap: () {
if (Platform.isIOS) {
launch('https://maps.apple.com/?q=47.6,8.8796');
} else {
launch(
'https://www.google.com/maps/search/?api=1&query=47.6,8.8796');
}
},
child: Text(
'START NAVIGATION',
style: TextStyle(
letterSpacing: 0.35,
fontWeight: FontWeight.w600,
),
),
),
),
),
);
}
}
扑博士:
dynClient36:flutter_app mhein$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.7.8+hotfix.4, on Mac OS X 10.14.5 18F132, locale de-DE)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 10.2.1)
[✓] iOS tools - develop for iOS devices
[✓] Android Studio (version 3.4)
[✓] VS Code (version 1.36.1)
[✓] Connected device (2 available)
• No issues found!
dynClient36:flutter_app mhein$
info plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>flutter_app</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSLocationWhenInUseUsageDescription</key>
<string>JELEJÖLWEKQÖEwkÖ</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Always Permission</string>
<key>io.flutter.embedded_views_preview</key>
<true/>
</dict>
</plist>
运行 您的代码并通过在 info.plist
中添加以下键解决了问题
键名:io.flutter.embedded_views_preview
类型:布尔值
值:是
当我 运行 我的 iPhone 5S 上的代码时,我可以在开始时看到空白屏幕(因此,甚至没有显示 HomePage())。虽然出现错误:
[VERBOSE-2:platform_view_layer.cc(19)] Trying to embed a platform view but the PrerollContext does not support embedding
这导致 Github 上的 issue 与 iOS 的 Google 地图插件相关。
PoC here 供大家参考
我可以在 iPhone 上重现该问题 6. 当通过 Xcode 启动时,它实际上抛出了这个错误:Thread 1: EXC_BAD_ACCESS (code=1, address=0x1)
in Runner/Runner/Supporting Files/main。米
等待 url 在 onTap 函数中启动后,如下所示:
onTap: () async {
if (Platform.isIOS) {
await launch('https://maps.apple.com/?q=47.6,8.8796');
} else {
await launch('https://www.google.com/maps/search/?api=1&query=47.6,8.8796');
}
}
我无法再次重现该错误。
我猜当 url 未等待启动时,Flutter 应用程序未正确进入后台模式。
我也遇到了与您类似的问题,但能够找到解决方法。
导航时不要使用 Navigator.push
,而是使用 Navigator.pushReplacement
,并设置屏幕上的后退按钮以转到主屏幕并使用 Navigator.pushReplacement.By
导航到主屏幕。
这样,您将能够再次重新加载主屏幕并正确加载地图。
Flutte google 贴图似乎是一个更严重的错误。是 #25653
的副本8 月 8 日更新:当前进度:
试图用 Sukhi 修复错误,但他无法重现错误。我的同事们都能够重现它,但无法修复它:P。有没有其他人设法重现它?
还创建了 github repo with my code 并更新了 "what I tried so far"
8月5日更新,越来越接近真正的问题
问题的解释:
我的问题只发生在 IOs 和 真实设备(不是模拟器)上 调试 和 发布.
我确实使用带有一些标记的 google 地图小部件。点击标记打开另一个屏幕,其中包含更多信息、另一个 google 地图小部件以及通过 url 启动器导航的可能性。 (我减少了屏幕以仅显示导致问题的小部件)
离开该应用程序(例如点击开始导航或转到 IOs 主屏幕)然后返回该应用程序会导致问题。
如果我再次回到应用程序主屏幕,只会显示白屏。
加法:
在 Flex 小部件(列或行)的信息屏幕中包装 Google 地图小部件甚至会导致更糟糕的行为。返回到应用程序主屏幕时,Flex 小部件的其他内容(例如带有文本的容器)将保持可见。
到目前为止我尝试让它工作但没有工作:
- 发布模式=>同样的问题
- 禁用导航转换(like this)
- 异步等待url启动
- 基于 IOs 12.3 和 12.4
- 在 Future Builder 中构建地图小部件
重现步骤:
安装google_maps_flutter 0.5.20+1 and url_launcher: 5.0.3(我知道这不是最新的,但这不是问题所在)
在 flutter 项目中复制 CodeSnippet 并在 IOs.
上构建
点击标记
- 点击按钮 "Start Navigation" 或离开应用程序
- 点击左上角的苹果地图重定向到应用程序或重新打开应用程序
- 回到信息屏幕,点击左上角的左箭头
- 只能看到白屏
代码:
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:url_launcher/url_launcher.dart';
import 'dart:io';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: "/",
routes: {
"/": (context) => HomePage(),
},
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: GoogleMap(
initialCameraPosition: CameraPosition(
target: const LatLng(47.6, 8.8796),
zoom: 7,
),
markers: Set<Marker>()
..add(
Marker(
markerId: MarkerId('hi'),
position: LatLng(47.6, 8.8796),
consumeTapEvents: true,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => InfoScreen()),
);
},
),
),
),
);
}
}
class InfoScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("info Page"),),
body: GoogleMap(
initialCameraPosition: CameraPosition(
target: const LatLng(47.6, 8.8796),
zoom: 7,
),
markers: Set<Marker>()
..add(
Marker(
markerId: MarkerId('hi2'),
consumeTapEvents: true,
position: LatLng(47.6, 8.8796),
onTap: () {
if (Platform.isIOS) {
launch('https://maps.apple.com/?q=47.6,8.8796');
} else {
launch(
'https://www.google.com/maps/search/?api=1&query=47.6,8.8796');
}
},
),
),
),
bottomNavigationBar: BottomAppBar(
elevation: 0,
child: Container(
padding: const EdgeInsets.symmetric(vertical: 19, horizontal: 25),
height: 80,
child: InkWell(
onTap: () {
if (Platform.isIOS) {
launch('https://maps.apple.com/?q=47.6,8.8796');
} else {
launch(
'https://www.google.com/maps/search/?api=1&query=47.6,8.8796');
}
},
child: Text(
'START NAVIGATION',
style: TextStyle(
letterSpacing: 0.35,
fontWeight: FontWeight.w600,
),
),
),
),
),
);
}
}
扑博士:
dynClient36:flutter_app mhein$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.7.8+hotfix.4, on Mac OS X 10.14.5 18F132, locale de-DE)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 10.2.1)
[✓] iOS tools - develop for iOS devices
[✓] Android Studio (version 3.4)
[✓] VS Code (version 1.36.1)
[✓] Connected device (2 available)
• No issues found!
dynClient36:flutter_app mhein$
info plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>flutter_app</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>NSLocationWhenInUseUsageDescription</key>
<string>JELEJÖLWEKQÖEwkÖ</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Always Permission</string>
<key>io.flutter.embedded_views_preview</key>
<true/>
</dict>
</plist>
运行 您的代码并通过在 info.plist
中添加以下键解决了问题键名:io.flutter.embedded_views_preview 类型:布尔值 值:是
当我 运行 我的 iPhone 5S 上的代码时,我可以在开始时看到空白屏幕(因此,甚至没有显示 HomePage())。虽然出现错误:
[VERBOSE-2:platform_view_layer.cc(19)] Trying to embed a platform view but the PrerollContext does not support embedding
这导致 Github 上的 issue 与 iOS 的 Google 地图插件相关。
PoC here 供大家参考
我可以在 iPhone 上重现该问题 6. 当通过 Xcode 启动时,它实际上抛出了这个错误:Thread 1: EXC_BAD_ACCESS (code=1, address=0x1)
in Runner/Runner/Supporting Files/main。米
等待 url 在 onTap 函数中启动后,如下所示:
onTap: () async {
if (Platform.isIOS) {
await launch('https://maps.apple.com/?q=47.6,8.8796');
} else {
await launch('https://www.google.com/maps/search/?api=1&query=47.6,8.8796');
}
}
我无法再次重现该错误。 我猜当 url 未等待启动时,Flutter 应用程序未正确进入后台模式。
我也遇到了与您类似的问题,但能够找到解决方法。
导航时不要使用 Navigator.push
,而是使用 Navigator.pushReplacement
,并设置屏幕上的后退按钮以转到主屏幕并使用 Navigator.pushReplacement.By
导航到主屏幕。
这样,您将能够再次重新加载主屏幕并正确加载地图。