Проблемы с возвратом в приложение с использованием двух экранов с Google Maps
Кажется, более серьезная ошибка с Google Flutte. Является дубликатом #25653
Обновление 8 августа: текущий прогресс:
Пытался исправить ошибку с Сухи, но он не смог воспроизвести ошибку. Все мои коллеги смогли воспроизвести это, но не смогли это исправить:P. Кому-нибудь еще удалось воспроизвести это?
Также создал репозиторий github с моим кодом и обновил "то, что я пробовал до сих пор"
Обновлено 5 августа, ближе к реальной проблеме
Объяснение проблемы:
Моя проблема возникает только на IO на реальных устройствах (не на симуляторе) при отладке и выпуске.
Я использую виджет Google Maps с некоторыми маркерами. При нажатии на маркер открывается еще один экран с дополнительной информацией, другой виджет Google Maps и возможность навигации по программе запуска URL. (Я уменьшил экраны, чтобы показывать только виджеты, вызывающие проблему)
Выход из приложения с этого экрана (например, нажав кнопку "Начать навигацию" или переход на домашний экран IO) и последующий возврат к приложению приводит к проблеме.
Если я снова вернусь к домашнему экрану приложения, отображается только белый экран.
Дополнение:
Оборачивание виджета Карт Google на информационном экране в виджете Flex (столбец или строка) даже ведет к ухудшению поведения. При возврате на домашний экран приложений дополнительное содержимое виджета Flex (например, контейнер с текстом) останется видимым.
Что я пытался до сих пор, чтобы заставить его работать, но не сработало:
- Режим выпуска => Та же проблема
- Отключен навигационный переход ( как это)
- асинхронное ожидание запуска URL
- Опираясь на IO 12.3 и 12.4
- Создание виджета "Карты" в построителе будущего
Действия по воспроизведению:
Установите google_maps_flutter 0.5.20+1 и url_launcher: 5.0.3 (я знаю, что это не последняя версия, но это не проблема)
Скопируйте CodeSnippet в флаттер-проект и постройте IO.
Нажмите на маркер
- Нажмите на кнопку "Начать навигацию" или выйдите из приложения
- Нажмите в Apple Maps в верхнем левом углу, чтобы перенаправить на приложение или снова открыть приложение
- Спиной к информационному экрану коснитесь левой стрелки в левом верхнем углу.
- Виден только белый экран
Код:
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>
2 ответа
Запустил свой код и решил проблему, добавив следующий ключ в 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, связанной с плагином Google Maps для iOS.
PoC здесь для вашей справки.
У меня тоже была аналогичная проблема, как у вас, но я смог найти способ ее решить.
Вместо того, чтобы использовать Navigator.push
использовать Navigator.pushReplacement
во время навигации и настройте экранную кнопку возврата, чтобы перейти на главный экран и перейти на главный экран, используя Navigator.pushReplacement.By
.
Таким образом, вы снова сможете перезагрузить рабочий стол и карта загрузится правильно.
Я могу воспроизвести проблему на iPhone 6. При запуске через XCode это фактически выдало эту ошибку: Thread 1: EXC_BAD_ACCESS (code=1, address=0x1)
в Runner/Runner/ Вспомогательные файлы /main.m.
После ожидания запуска 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');
}
}
Я не смог воспроизвести ошибку снова. Я полагаю, что приложение Flutter некорректно переходит в фоновый режим, когда запуск URL не ожидается.