簡體   English   中英

禁用長按 Flutter WebView

[英]Disable long press for Flutter WebView

我正在尋找一種方法來禁用 flutter WebView package 的長按手勢: https://pub.dev/packages/webview_flutter

我發現通過將 web 視圖包裝在 GestureDetector 中,我可以防止這種情況發生,效果很好。 但是,在第一次長按然后在 web 視圖中滾動后,不再正常工作。

抱歉,如果之前有人回答過這個問題,但我找不到任何關於如何做到這一點的信息,也找不到自己做的方法。

在此先感謝您的幫助/建議

好的,經過多次試驗和錯誤,我終於弄明白了

基本上你需要設置和重用 WebViewController (這是在onWebViewCreated中設置的),然后在onPageFinished里面你可以使用evaluateJavascript function 注入你的 JavaScript 字符串。

import 'dart:async';

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

class Example extends StatefulWidget {
  @override
  ExampleState createState() => ExampleState();
}

class ExampleState extends State<Example> {
  final Completer<WebViewController> _controller = Completer<WebViewController>();

  WebViewController _webViewController;

  String jsString = 'document.addEventListener("contextmenu", event => event.preventDefault());';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: WebView(
        initialUrl: 'Your URL goes here',
        javascriptMode: JavascriptMode.unrestricted,
        gestureNavigationEnabled: false,
        onWebViewCreated: (WebViewController webViewController) async {
          _webViewController = webViewController;
          _controller.complete(webViewController);
        },
        onPageFinished: (_) {
          _webViewController.evaluateJavascript(jsString);
        },
      ),
    );
  }
}
class _CourseReadState extends State<CourseRead> {
  final GlobalKey webViewKey = GlobalKey();
  WebViewController? _webViewController;
  final Completer<WebViewController> _controller =
      Completer<WebViewController>();
  String jsString =
      'document.addEventListener("contextmenu", event => event.preventDefault());';
  @override
  void initState() {
    super.initState();
    if (Platform.isAndroid) {
      WebView.platform = SurfaceAndroidWebView();
    }
  }
  @override
  Widget build(BuildContext ctx) {
    return BlocBuilder<CourseReadBloc, CourseReadState>(
      
      builder: (context, state) {
        if (state is CourseReadLoaded) {
          return Scaffold(
            appBar: MyAppBar(height: 60.h, title: 'title'),
            body: WebView(
              key: webViewKey,
              gestureNavigationEnabled: false,
              gestureRecognizers: {
                Factory<OneSequenceGestureRecognizer>(
                  () => EagerGestureRecognizer(),
                ),
              },
              onWebViewCreated: (WebViewController webViewController) async {
                _webViewController = webViewController;
                _controller.complete(webViewController);
              },
              onPageFinished: (_) {
                _webViewController!.runJavascriptReturningResult(jsString);
              },
              javascriptMode: JavascriptMode.unrestricted,
              initialUrl: Uri.dataFromString(
                state.html,
                mimeType: 'text/html',
                encoding: Encoding.getByName('utf-8'),
              ).toString(),
            ),
          );
        }
        if (state is CourseReadError) {
          return Scaffold(
            appBar: MyAppBar(height: 60.h, title: 'title'),
            body: Center(child: Text(state.error)),
          );
        }
        return const Scaffold(body: progressIndicator);
      },
    );
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM