Проблемы с возвратом в приложение с использованием двух экранов с Google Maps

Кажется, более серьезная ошибка с Google Flutte. Является дубликатом #25653

Обновление 8 августа: текущий прогресс:

Пытался исправить ошибку с Сухи, но он не смог воспроизвести ошибку. Все мои коллеги смогли воспроизвести это, но не смогли это исправить:P. Кому-нибудь еще удалось воспроизвести это?

Также создал репозиторий github с моим кодом и обновил "то, что я пробовал до сих пор"

Обновлено 5 августа, ближе к реальной проблеме

Объяснение проблемы:

Моя проблема возникает только на IO на реальных устройствах (не на симуляторе) при отладке и выпуске.

Я использую виджет Google Maps с некоторыми маркерами. При нажатии на маркер открывается еще один экран с дополнительной информацией, другой виджет Google Maps и возможность навигации по программе запуска URL. (Я уменьшил экраны, чтобы показывать только виджеты, вызывающие проблему)

Выход из приложения с этого экрана (например, нажав кнопку "Начать навигацию" или переход на домашний экран IO) и последующий возврат к приложению приводит к проблеме.

Если я снова вернусь к домашнему экрану приложения, отображается только белый экран.

Дополнение:

Оборачивание виджета Карт Google на информационном экране в виджете Flex (столбец или строка) даже ведет к ухудшению поведения. При возврате на домашний экран приложений дополнительное содержимое виджета Flex (например, контейнер с текстом) останется видимым.

Что я пытался до сих пор, чтобы заставить его работать, но не сработало:

  1. Режим выпуска => Та же проблема
  2. Отключен навигационный переход ( как это)
  3. асинхронное ожидание запуска URL
  4. Опираясь на IO 12.3 и 12.4
  5. Создание виджета "Карты" в построителе будущего

Действия по воспроизведению:

  1. Установите google_maps_flutter 0.5.20+1 и url_launcher: 5.0.3 (я знаю, что это не последняя версия, но это не проблема)

  2. Скопируйте CodeSnippet в флаттер-проект и постройте IO.

  3. Нажмите на маркер

  4. Нажмите на кнопку "Начать навигацию" или выйдите из приложения
  5. Нажмите в Apple Maps в верхнем левом углу, чтобы перенаправить на приложение или снова открыть приложение
  6. Спиной к информационному экрану коснитесь левой стрелки в левом верхнем углу.
  7. Виден только белый экран

Код:

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 не ожидается.

Другие вопросы по тегам