【问题标题】:Device back button not returning to previous webview设备后退按钮未返回到先前的 web 视图
【发布时间】:2020-04-27 22:12:28
【问题描述】:

刚到这里,我的项目应用程序现在差不多好了。但由于某种原因,我无法回到以前的 webview。它似乎没有检测到我的水龙头。

顺便说一句,我正在使用 Flutter 开发团队的 WebView

我尝试过的:将 Scaffold 包裹在 WillPopScope 中 - 不起作用

另外,我的Future<bool> 有一个返回语句,但它似乎没有检测或读取该返回语句。

_exitApp 也是一条蓝色波浪线,表示我应该有一个返回语句,您可以在下面看到它,但由于某种原因它没有阅读它。

我的代码:

class HomePage extends StatefulWidget {
  // HomePage({Key key}) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();


@override
void initState() {
  super.initState();
  firebaseCloudMessagingListeners();
}
void firebaseCloudMessagingListeners() {
  if (Platform.isIOS) iOSPermission();

  _firebaseMessaging.getToken().then((token){
    print(token);
  });

  _firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) async {
      setState(() {
      print("${message['data']['url']}");
      Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => NotificationClicked()));
      });
    },
    onResume: (Map<String, dynamic> message) async {
      print("${message['data']['url']}");
    },
    onLaunch: (Map<String, dynamic> message) async {  
      print("${message['data']['url']}");
    },
  );
}

void iOSPermission() {
  _firebaseMessaging.requestNotificationPermissions(
      IosNotificationSettings(sound: true, badge: true, alert: true)
  );
  _firebaseMessaging.onIosSettingsRegistered
      .listen((IosNotificationSettings settings)
  {
    print("Settings registered: $settings");
  });
}

  WebViewController myController;
      final Completer<WebViewController> _controller =
      Completer<WebViewController>();


/* The _exitApp also as a blue squiggly line which says I should have a return statement, below you can see it but for some reason its not reading it. */

Future<bool> _exitApp(BuildContext context) async {
  if (await myController.canGoBack()) {
    print("onwill goback");
    myController.goBack();
  } else {
    Scaffold.of(context).showSnackBar(
      const SnackBar(content: Text("No back history item")),
    );
    return Future.value(false);
  }
}

  @override
  Widget build(BuildContext context) {
    return SafeArea(
            child: WillPopScope(
              onWillPop: () => _exitApp(context),
                          child: Scaffold(
                    body: WebView(
                    initialUrl: 'https://syncshop.online/en/',
                    javascriptMode: JavascriptMode.unrestricted,
                    onWebViewCreated: (controller) {
                    _controller.complete(controller);
                  },
          onPageFinished: (controller) async {
          (await _controller.future).evaluateJavascript("document.getElementsByClassName('footer-container')[0].style.display='none';");
              (await _controller.future).evaluateJavascript("document.getElementById('st_notification_1').style.display='none';");
              (await _controller.future).evaluateJavascript("document.getElementById('sidebar_box').style.display='none';");
          },
          ),

【问题讨论】:

  • _exitAppif 的第一部分没有返回语句
  • 谢谢,但我仍然无法回到以前的 webview :( 我仍在尝试找到修复程序。我找到了这个 stackoverflow.com/questions/57878887/using-flutter-webview-as-home- and-pressing-back-button-closes-application 这是我尝试过的,但它仍然没有回到 webview 的上一个屏幕
  • 为什么在你的脚手架中使用 WillPopScope
  • @Avinash 我也将它用于 WebView 但仍然无法正常工作。我仍在寻找解决此问题的方法。它没有关闭应用程序,但它没有返回到以前的 webview 网页

标签: android flutter flutter-layout flutter-web


【解决方案1】:

请检查一下,它可能对你有帮助

 _exitApp(BuildContext context,Future<WebViewController> controller) async {
controller.then((data) async {
  WebViewController controller= data;
 var goback= await controller.canGoBack();
  if (goback==true) {
    // ignore: missing_return
    print("onwill goback");
    controller.goBack();
  // ignore: missing_return
  } else {
    print("onwill not goback");
   Navigator.pop(context);
  }

}, onError: (e) {
  print(e);
});

}

and callfrom onwillpop()

_exitApp(context,_controller.future),

【讨论】:

  • 感谢您。我将分析您的代码以充分了解它是如何工作的,我的非常感谢您!
  • 只是想问一下,为什么将控制器分配给数据?
  • 在您的情况下,您将 myController 用于 myController.canGoBack() 但它没有返回任何内容,因为它没有被初始化所以在我的情况下,我正在使用 _controller.future 获取控制器,并且 _controller 在 webview 和数据中分配是 WebViewController 。你可以使用任何东西而不是数据。但它始终是 WebViewController。因为它是在 Future 对象中获取数据的过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多