как разрешить схемы mailto во флаттере веб-просмотра

Я работаю над приложениями веб-просмотра Flutter, используя плагин Flutter Webview.

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: SafeArea(
              child : const WebView(
                initialUrl: 'https://google.com',
                javascriptMode: JavascriptMode.unrestricted,
              ),
            )
        )
    );
  }
}

Однако, если какие-либо ссылки внутри открытой веб-страницы являются ссылкой на приложение, например: fb: // profile, я получу net :: ERR_UNKNOWN_URL_SCHEME.

В android я обнаружил, что решение состоит в том, чтобы переопределить shouldOverrideUrlLoading, как указано здесь, а что мне делать во флаттере?

Я пробую решение, упомянутое здесь.

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: SafeArea(
              child : const WebView(
                initialUrl: 'https://google.com',
                javascriptMode: JavascriptMode.unrestricted,
                navigationDelegate: (NavigationRequest request)  {
                  if (request.url.contains("mailto:")) {
                    launch(request.url);
                    return NavigationDecision.navigate;
                  }
                },
              ),
            )
        )
    );
  }
}

Но он выдает такие ошибки, как

Ошибка: не постоянное выражение. if (request.url.contains (mailto :)) {


person PARAS GUPTA    schedule 25.01.2021    source источник


Ответы (1)


Вы можете скопировать и вставить полный код ниже
Шаг 1. Вы можете удалить const ключевое слово из const WebView
Шаг 2. Вы можете использовать NavigationDecision.prevent

рабочая демонстрация

введите описание изображения здесь

полный код

import 'package: flutter / material.dart'; import 'package: webview_flutter / webview_flutter.dart'; import 'package: url_launcher / url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            body: SafeArea(
      child: WebView(
        initialUrl:
            'https://google.com', //'''https://www.scottseverance.us/mailto.html',
        javascriptMode: JavascriptMode.unrestricted,
        navigationDelegate: (NavigationRequest request) {
          print(request.url);
          if (request.url.contains("mailto:")) {
            launch(request.url);
            return NavigationDecision.prevent;
          } else {
            return NavigationDecision.navigate;
          }
        },
      ),
    )));
  }
}
person chunhunghan    schedule 25.01.2021
comment
Подход работает нормально. Но после внесения изменений приложение не открывается на мобильном телефоне. Кроме того, в симуляторе не работают якорные теги. - person PARAS GUPTA; 25.01.2021
comment
Я обновил полный код, вы можете добавить еще return NavigationDecision.navigate - person chunhunghan; 26.01.2021