简体   繁体   中英

How to Hide Keyboard in Flutter WebView

I have a flutter WebView Code everything is working perfectly but am not able to hide keyboard am using onTap to hide keyboard its my first time coding in flutter so please any suggestion.

import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter/services.dart';
void main() => runApp(MaterialApp(home: WebViewExample()));
class WebViewExample extends StatefulWidget {
  @override
  _WebViewExampleState createState() => _WebViewExampleState();
}
WebViewController controllerGlobal;
Future<bool> _exitApp(BuildContext context) async {
  if (await controllerGlobal.canGoBack()) {
    print("onwill goback");
    controllerGlobal.goBack();
  } else {
    Scaffold.of(context).showSnackBar(
      const SnackBar(content: Text("No back history item")),
    );
    return Future.value(false);
  }
}
class _WebViewExampleState extends State<WebViewExample> {
  final Completer<WebViewController> _controller =
  Completer<WebViewController>();
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () => _exitApp(context),
       child:  GestureDetector(
                  onTap: () {
                    FocusScope.of(context).unfocus();
                  },
      child: Scaffold( 
        appBar: AppBar(
          title: const Text('ContactMaid'),
          actions: <Widget>[
            NavigationControls(_controller.future),
         //   SampleMenu(_controller.future),
          ],
        ),
         body: Builder(builder: (BuildContext context) {
          return WebView(
            initialUrl: 'https://google.com',
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController webViewController) {
              _controller.complete(webViewController);
            },  
            javascriptChannels: <JavascriptChannel>[
              _toasterJavascriptChannel(context),
            ].toSet(),
            onPageFinished: (String url) {
              print('Page finished loading: $url');
            },
          );
        }),
      ),
    ),
    );
  }
JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
    return JavascriptChannel(
        name: 'Toaster',
        onMessageReceived: (JavascriptMessage message) {
          Scaffold.of(context).showSnackBar(
            SnackBar(content: Text(message.message)),
          );
        });
  }
}
class NavigationControls extends StatelessWidget {
  const NavigationControls(this._webViewControllerFuture)
      : assert(_webViewControllerFuture != null);
final Future<WebViewController> _webViewControllerFuture;
  @override
  Widget build(BuildContext context) {
    return FutureBuilder<WebViewController>(
      future: _webViewControllerFuture,
      builder:
          (BuildContext context, AsyncSnapshot<WebViewController> snapshot) {
        final bool webViewReady =
            snapshot.connectionState == ConnectionState.done;
        final WebViewController controller = snapshot.data;
        controllerGlobal = controller;
    return Row(
          children: <Widget>[
            IconButton(
              icon: const Icon(Icons.arrow_back_ios),
              onPressed: !webViewReady
                  ? null
                  : () async {
                if (await controller.canGoBack()) {
                  controller.goBack();
                } else {
                  Scaffold.of(context).showSnackBar(
                    const SnackBar(content: Text("No back history item")),
                  );
                  return;
                }
              },
            ),
            IconButton(
              icon: const Icon(Icons.arrow_forward_ios),
              onPressed: !webViewReady
                  ? null
                  : () async {
                if (await controller.canGoForward()) {
                  controller.goForward();
                } else {
                  Scaffold.of(context).showSnackBar(
                    const SnackBar(
                        content: Text("No forward history item")),
                  );
                  return;
                }
              },
            ),
            IconButton(
              icon: const Icon(Icons.replay),
              onPressed: !webViewReady
                  ? null
                  : () {
                controller.reload();
              },
            ),
          ],
        );
      },
    );
  }
} 

Here is the specific Class where am writing onTap Code

class _WebViewExampleState extends State<WebViewExample> {
  final Completer<WebViewController> _controller =
  Completer<WebViewController>();

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () => _exitApp(context),
       child:  GestureDetector(
                  onTap: () {
                    FocusScope.of(context).unfocus();
                  },
      child: Scaffold(

        appBar: AppBar(
          title: const Text('ContactMaid'),
          // This drop down menu demonstrates that Flutter widgets can be shown over the web view.
          actions: <Widget>[
            NavigationControls(_controller.future),
         //   SampleMenu(_controller.future),
          ],
        ),
        body: Builder(builder: (BuildContext context) {
         return WebView(
            initialUrl: 'https://nextlevelgroup.me',
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController webViewController) {
              _controller.complete(webViewController);
            },
            javascriptChannels: <JavascriptChannel>[
              _toasterJavascriptChannel(context),
            ].toSet(),

            onPageFinished: (String url) {
              print('Page finished loading: $url');
            },

          );
        }),
      ),
    ),
    );
  }
  JavascriptChannel _toasterJavascriptChannel(BuildContext context) {
    return JavascriptChannel(
        name: 'Toaster',
        onMessageReceived: (JavascriptMessage message) {
          Scaffold.of(context).showSnackBar(
            SnackBar(content: Text(message.message)),
          );
        });
  }

}

and that is the specific code that am using to hide the keyboard

child:  GestureDetector(
                  onTap: () {
                    FocusScope.of(context).unfocus();
                 },
              //all other data
               );

this is a function I wrote to basically dismiss a keyboard when swiping over it. feel free to use it

 Widget swipeOffKeyboard(BuildContext context, {Widget? child}) { return Listener( onPointerMove: (PointerMoveEvent pointer) { swipeDownKeyBoard(pointer, context); }, child: child, // your content should go here ); } void swipeDownKeyBoard(PointerMoveEvent pointer, BuildContext context) { double insets = MediaQuery.of(context).viewInsets.bottom; double screenHeight = MediaQuery.of(context).size.height; double position = pointer.position.dy; double keyboardHeight = screenHeight - insets; if (position > keyboardHeight && insets > 0) FocusManager.instance.primaryFocus?.unfocus(); }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM