【问题标题】:How can I dispose Flutter WebviewScaffold on screen change?如何在屏幕更改时处理 Flutter WebviewScaffold?
【发布时间】:2019-06-01 13:39:52
【问题描述】:

我有一个主屏幕,其中显示带有按钮的标题图像以路由到第二个屏幕,以及它下方容器中的 webview(脚手架)。当我切换到第二个屏幕时,webview 仍然存在。 这似乎与这个问题(Flutter: to close a webview when you left the page)类似,但我不知道如何实现 dispose 事件。任何人都可以帮忙吗? 我正在使用 flutter_webview_plugin 包。 这是我的代码:

import 'package:flutter/material.dart';

import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';

import 'dart:async';

import './SecondScreen.dart';

String selectedUrl = 'https://flutter.io';

void main() {
  runApp(new MyApp());
}

class MyApp extends StatelessWidget {
  final flutterWebViewPlugin = FlutterWebviewPlugin();

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Generated App',
      theme: new ThemeData(
        primarySwatch: Colors.purple,
        primaryColor: const Color(0xFF8e80a8),
        accentColor: const Color(0xFF8e80a8),
        canvasColor: const Color(0xFF8e80a8),
      ),
      home: new MyHomePage(),
    );
  }
}

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

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {


  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(color: Color(0xFF8e80a8)),
      child: new Column(
          mainAxisAlignment: MainAxisAlignment.start,
          mainAxisSize: MainAxisSize.min,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.fromLTRB(10, 30, 10, 5),
              child: new Image.asset(
                'lib/assets/newoldralogo1.png',
              ),
            ),
            Container(
              constraints: BoxConstraints.expand(
                height:
                    Theme.of(context).textTheme.display1.fontSize * 1.1 + 10.0,
              ),
              child: new Stack(fit: StackFit.expand,
                  children: <Widget>[
                Container(
                  decoration: BoxDecoration(color: Color(0xFF8e80a8)),
                  child: Padding(
                    padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
                    child: Image.asset(
                      "lib/assets/newoldralogo1.png",
                      alignment: Alignment.topCenter,
                      fit: BoxFit.fitWidth,
                    ),
                  ),
                ),
                Container(
                  child: RaisedButton(
                    onPressed: () {
                      Navigator.push(
                        context,
                        MaterialPageRoute(builder: (context) => SecondScreen()),
                      );
                    },
                    color: Color(0xFFFFFF),
                  ),
                ),
              ]),
            ),

            Container(
              constraints: BoxConstraints.expand(
                height:
                    Theme.of(context).textTheme.display1.fontSize * 1.1 + 300.0,
              ),
              padding: const EdgeInsets.fromLTRB(10, 15, 10, 5),
              color: Color(0xFF8e80a8),
              alignment: Alignment.center,
              child: Container(
                child: WebviewScaffold(
                  url:
                      ('https://flutter.io/'),
                ),
              ),
            )
          ]),
    );
  }
}

/*
@override
void dispose() {
  super.dispose();
  _MyHomePageState();

}
*/

【问题讨论】:

  • 为了让我们能够提供帮助,请发布您尝试过的内容以及遇到的错误。
  • 显然,我对这一切都很陌生。感谢您的耐心和帮助。
  • 我试图在代码中的几个地方添加@override void dispose 东西来处理webviewscaffold 小部件,但它没有奏效。我在上面的代码示例中将其注释掉了。

标签: webview flutter


【解决方案1】:

解决方案是将“Navigator.push”更改为“Navigator.pushRemove”。这意味着第一个屏幕不会重新出现,因此按下后退按钮(至少在 Android 设备上)将退出应用程序。 这不是我想要做的,但现在可以。

如果有人能告诉我把“处置”的东西放在哪里,我仍然很想知道!与此同时,我会继续努力。感谢那些在网络上分享了很多有用信息的人!

顺便说一下,这里是新代码,清理了一下:

import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import './SecondScreen.dart';

class WebView extends StatefulWidget {
  @override
  _WebViewState createState() => _WebViewState();
}

class _WebViewState extends State<WebView> {
  TextEditingController controller = TextEditingController();
  FlutterWebviewPlugin flutterWebviewPlugin = FlutterWebviewPlugin();
  var urlString =
      "https://stackoverflow.com/questions/43692923/flutter-container-onpressed";

  launchUrl() {
    setState(() {
      urlString = controller.text;
      flutterWebviewPlugin.reloadUrl(urlString);
    });
  }

  @override
  void initState() {
    super.initState();
    flutterWebviewPlugin.onStateChanged.listen((WebViewStateChanged wvs) {
      print(wvs.type);
    });
  }

  //this part isn't working
  @override
  void dispose() {
    _WebViewState();
    // close the webview here
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(color: Color(0xFF8e80a8)),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        mainAxisSize: MainAxisSize.min,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          new GestureDetector(
            onTap: () {
              Navigator.pushReplacement(
                context,
                MaterialPageRoute(builder: (context) => SecondScreen()),
              );
            },
            child: Padding(
              padding: const EdgeInsets.fromLTRB(10, 40, 10, 10),
              child: new Container(
                  constraints: BoxConstraints.expand(
                    height: Theme.of(context).textTheme.display1.fontSize * 1.1 +
                        40.0,
                  ),
                  child: new Image.asset(
                    'lib/assets/newoldralogo1menubutton3.png',
                    alignment: Alignment.topCenter,
                    fit: BoxFit.fitWidth,
                  )),
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(10.0),
            child: Container(
              constraints: BoxConstraints.expand(
                height: Theme.of(context).textTheme.display1.fontSize * 1.1 + 250.0,
              ),
              child: WebviewScaffold(
                url: urlString,
                withZoom: false,
              ),
            ),
          ),
        ],
      ),
    );
  }
}

【讨论】:

    【解决方案2】:

    当用户导航到第二个屏幕时隐藏 web 视图

    flutterWebViewPlugin.hide();
    

    并在用户返回时再次显示

    flutterWebViewPlugin.show();
    

    应该可以解决问题。通过使用这种方式,用户可以在导航到第二个屏幕后返回到第一个屏幕。

    记得等待 Navigator.push() 到第二个屏幕。

    import 'package:flutter/material.dart';
    
    import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
    
    import 'dart:async';
    
    import './SecondScreen.dart';
    
    String selectedUrl = 'https://flutter.io';
    
    void main() {
      runApp(new MyApp());
    }
    
    class MyApp extends StatelessWidget {
      final flutterWebViewPlugin = FlutterWebviewPlugin();
    
      @override
      Widget build(BuildContext context) {
        return new MaterialApp(
          title: 'Generated App',
          theme: new ThemeData(
            primarySwatch: Colors.purple,
            primaryColor: const Color(0xFF8e80a8),
            accentColor: const Color(0xFF8e80a8),
            canvasColor: const Color(0xFF8e80a8),
          ),
          home: new MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key}) : super(key: key);
    
      @override
      _MyHomePageState createState() => new _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
    
    
      @override
      Widget build(BuildContext context) {
        return Container(
          decoration: BoxDecoration(color: Color(0xFF8e80a8)),
          child: new Column(
              mainAxisAlignment: MainAxisAlignment.start,
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: <Widget>[
                Padding(
                  padding: const EdgeInsets.fromLTRB(10, 30, 10, 5),
                  child: new Image.asset(
                    'lib/assets/newoldralogo1.png',
                  ),
                ),
                Container(
                  constraints: BoxConstraints.expand(
                    height:
                        Theme.of(context).textTheme.display1.fontSize * 1.1 + 10.0,
                  ),
                  child: new Stack(fit: StackFit.expand,
                      children: <Widget>[
                    Container(
                      decoration: BoxDecoration(color: Color(0xFF8e80a8)),
                      child: Padding(
                        padding: const EdgeInsets.fromLTRB(10, 10, 10, 10),
                        child: Image.asset(
                          "lib/assets/newoldralogo1.png",
                          alignment: Alignment.topCenter,
                          fit: BoxFit.fitWidth,
                        ),
                      ),
                    ),
                    Container(
                      child: RaisedButton(
                        onPressed: () async {
                          flutterWebViewPlugin.hide();
                          await Navigator.push(
                            context,
                            MaterialPageRoute(builder: (context) => SecondScreen()),
                          );
                          flutterWebViewPlugin.show();
                        },
                        color: Color(0xFFFFFF),
                      ),
                    ),
                  ]),
                ),
    
                Container(
                  constraints: BoxConstraints.expand(
                    height:
                        Theme.of(context).textTheme.display1.fontSize * 1.1 + 300.0,
                  ),
                  padding: const EdgeInsets.fromLTRB(10, 15, 10, 5),
                  color: Color(0xFF8e80a8),
                  alignment: Alignment.center,
                  child: Container(
                    child: WebviewScaffold(
                      url:
                          ('https://flutter.io/'),
                    ),
                  ),
                )
              ]),
        );
      }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多