1

私はフラッターにかなり慣れていないので、これが基本的な質問である場合はご容赦ください。

フルスクリーンのウェブビューのみを表示する Flutter アプリを作成しようとしていますが、履歴に戻るにはデバイスの戻るボタンが必要です。最初のタスクは簡単に達成できましたが、2 番目のタスクは苦労しています。

私はこの回答の指示に従いましたが、戻るボタンだけで 360 行以上の回答の煩雑さをすべて削除して機能させることはできませんでした。

私のコードは本当に簡単です:

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

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

WebViewController _controller;

Future<void> _onWillPop(BuildContext context) async {
  if (await _controller.canGoBack()) {
    _controller.goBack();
  } else {
    exit(0);
    return Future.value(false);
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    SystemChrome.setEnabledSystemUIOverlays([]);
    return WillPopScope(
      onWillPop: () => _onWillPop(context),
      child: MaterialApp(title: 'Test App', home: WebView(
      initialUrl: 'https://google.com',
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (WebViewController c) => _controller = c,
    )),
    );
  }
}

しかし、デバイスの戻るボタンを押そうとすると、次のエラーがスローされます。

java.lang.RuntimeException: Cannot execute operation because FlutterJNI is not attached to native.
    at io.flutter.embedding.engine.FlutterJNI.ensureAttachedToNative(FlutterJNI.java:227)
    at io.flutter.embedding.engine.FlutterJNI.markTextureFrameAvailable(FlutterJNI.java:554)
    at io.flutter.embedding.engine.renderer.FlutterRenderer.markTextureFrameAvailable(FlutterRenderer.java:274)
    at io.flutter.embedding.engine.renderer.FlutterRenderer.access$300(FlutterRenderer.java:38)
    at io.flutter.embedding.engine.renderer.FlutterRenderer$SurfaceTextureRegistryEntry$1.onFrameAvailable(FlutterRenderer.java:145)
    at android.graphics.SurfaceTexture$1.handleMessage(SurfaceTexture.java:211)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:224)
    at android.app.ActivityThread.main(ActivityThread.java:7520)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

flutter の github には少なくとも 3 つのスレッドがありますが、どの解決策もうまくいきませんでした。ここで何が欠けていますか?

4

3 に答える 3

0

これが実用的なソリューションです(100%機能)-

  // Use any webview plugin
  // WebView _controller;

  Future<void> _handleBack(context) async {
    var status = await _controller.canGoBack();
    if (status) {
      _controller.goBack();
    } else {
      showDialog(
          context: context,
          builder: (context) => AlertDialog(
                title: Text('Do you want to exit'),
                actions: <Widget>[
                  FlatButton(
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                    child: Text('No'),
                  ),
                  FlatButton(
                    onPressed: () {
                      SystemNavigator.pop();
                    },
                    child: Text('Yes'),
                  ),
                ],
              ));
    }
  }

ここで WillPopScope を呼び出しています

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
            onWillPop: () => _handleBack(context),
            child: SafeArea(
              top: true,
              child: Scaffold(......)))
于 2020-06-29T20:54:24.400 に答える