2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Flutter WebView スワイプで戻る

Posted at

やりたいこと

``webview_flutter``を利用してスワイプで戻るを実現するために調べてみました。 ですが、そう簡単にはいかず、これといったやり方を見つけることができませんでした。 数日、試行錯誤して何とかできたけれども、他のやり方だったりもっと良いやり方などあれば教えてほしいのです。

試したこと

・``gestureRecognizers``を利用してみる。 ・``PageView``を利用してみる。 ・``Dismissible``を利用してみる。 ・``GestureDetector``を利用してみる。

初学者の僕に理解するには難しかった、、、

その中で選ばれたのはGestureDetectorでした。

コード

import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';

void main() {
  runApp(MaterialApp(home: MyApp()));
}

class MyApp extends StatefulWidget {
  @override
  _State createState() => _State();
}

class _State extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }

  late WebViewController _webViewController;
  double _currentPositionX = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          WebView(
            initialUrl: 'https://flutter.dev',
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController controller) async {
              _webViewController = controller;
            },
          ),
          GestureDetector(
            onHorizontalDragUpdate: (details) {
              _currentPositionX = details.primaryDelta!.toDouble();
            },
            onHorizontalDragEnd: (details) async {
              print(_currentPositionX);
              if (_currentPositionX > 0) {
                if (await _webViewController.canGoBack()) {
                  await _webViewController.goBack();
                  print('もどる');
                }
              }
            },
            child: Container(width: 50, color: Colors.green),
          ),
        ],
      ),
    );
  }
}

やり方と感想

``WebView``の上に``Container``を配置 ``onHorizontal``で水平スクロールを感知 ``details.primaryDelta``で どっちのスワイプかを知る。 正の値だったら左から右 負の値だったら右から左 になります。

そしてgoBack()でページを戻す

後は、読み込み時処理に動作させないようにすることと
他の部品の高さを差し引いたコンテナにする。
コンテナ透明にする。
コンテナが大きすぎるとユーザーが利用しずらくなっちゃうので、
どのくらいの大きさにしようか検討中、、、

なんだか他にもっと良いやり方だったり書き方があると思うので、
わかる人がいたら是非!教えてください(`・ω・´)ゞ

参考URL

https://www.youtube.com/watch?v=RA-vLF_vnng https://pub.dev/packages/webview_flutter https://cbtdev.net/flutter-gesture-detector/ https://nobushiueshi.com/flutterwebview%E3%81%A7%E8%89%B2%E3%80%85%E3%81%AA%E6%93%8D%E4%BD%9C%E3%82%92%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E9%80%B2%E3%82%80%E3%80%81%E6%88%BB%E3%82%8B%E3%80%81%E3%83%AA%E3%83%AD%E3%83%BC/
2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?