如何处理屏幕更改时的颤振WebviewScaffold?

如何处理屏幕更改时的颤振WebviewScaffold?,webview,flutter,Webview,Flutter,我有一个主屏幕,它显示一个标题图像,带有按钮,可以路由到第二个屏幕,还有一个webview(scaffold)在它下面的容器中。当我切换到第二个屏幕时,webview仍然存在。 这似乎是一个与此()类似的问题,但我不知道如何实现dispose事件。有人能帮忙吗? 我正在使用flatter_webview_插件包。 这是我的密码: import 'package:flutter/material.dart'; import 'package:flutter_webview_plugin/flut

我有一个主屏幕,它显示一个标题图像,带有按钮,可以路由到第二个屏幕,还有一个webview(scaffold)在它下面的容器中。当我切换到第二个屏幕时,webview仍然存在。 这似乎是一个与此()类似的问题,但我不知道如何实现dispose事件。有人能帮忙吗? 我正在使用flatter_webview_插件包。 这是我的密码:

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();

}
*/
导入“包装:颤振/材料.省道”;
导入“包:flatter_webview_plugin/flatter_webview_plugin.dart”;
导入“dart:async”;
导入“/SecondScreen.dart”;
字符串selectedUrl=https://flutter.io';
void main(){
runApp(新的MyApp());
}
类MyApp扩展了无状态小部件{
最终的FlatterWebViewPlugin=FlatterWebViewPlugin();
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“生成的应用程序”,
主题:新主题数据(
原色样本:颜色。紫色,
原色:常量颜色(0xFF8e80a8),
accentColor:const Color(0xFF8e80a8),
画布颜色:常量颜色(0xFF8e80a8),
),
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key}):超级(Key:Key);
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回容器(
装饰:盒子装饰(颜色:颜色(0xFF8e80a8)),
子:新列(
mainAxisAlignment:mainAxisAlignment.start,
mainAxisSize:mainAxisSize.min,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
填充物(
填充:LTRB(10,30,10,5)中的常数边集,
子:新建Image.asset(
“lib/assets/newoldralogo1.png”,
),
),
容器(
约束:BoxConstraints.expand(
高度:
Theme.of(context).textTheme.display1.fontSize*1.1+10.0,
),
子项:新堆栈(fit:StackFit.expand,
儿童:[
容器(
装饰:盒子装饰(颜色:颜色(0xFF8e80a8)),
孩子:填充(
填充:从LTRB(10,10,10,10)开始的常数边集,
子:Image.asset(
“lib/assets/newoldralogo1.png”,
对齐:alignment.topCenter,
适合:BoxFit.fitWidth,
),
),
),
容器(
孩子:升起按钮(
已按下:(){
导航器。推(
上下文
MaterialPage路由(生成器:(上下文)=>SecondScreen()),
);
},
颜色:颜色(0xFFFFFF),
),
),
]),
),
容器(
约束:BoxConstraints.expand(
高度:
Theme.of(context).textTheme.display1.fontSize*1.1+300.0,
),
填充:LTRB(10,15,10,5)中的常数边集,
颜色:颜色(0xFF8e80a8),
对齐:对齐.center,
子:容器(
孩子:WebviewScaffold(
网址:
('https://flutter.io/'),
),
),
)
]),
);
}
}
/*
@凌驾
无效处置(){
super.dispose();
_MyHomePageState();
}
*/

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

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

顺便说一句,这是新代码,稍微整理了一下:

导入“包装:颤振/材料.省道”;
导入“包:flatter_webview_plugin/flatter_webview_plugin.dart”;
导入“/SecondScreen.dart”;
类WebView扩展了StatefulWidget{
@凌驾
_WebViewState createState()=>\u WebViewState();
}
类_WebViewState扩展了状态{
TextEditingController=TextEditingController();
FlatterWebViewPlugin FlatterWebViewPlugin=FlatterWebViewPlugin();
变量URL字符串=
"https://stackoverflow.com/questions/43692923/flutter-container-onpressed";
launchUrl(){
设置状态(){
urlString=controller.text;
重新加载URL(URL字符串);
});
}
@凌驾
void initState(){
super.initState();
FlightWebViewPlugin.onStateChanged.listen((WebViewStateChanged wvs){
打印(wvs.类型);
});
}
//这部分坏了
@凌驾
无效处置(){
_WebViewState();
//在此处关闭webview
super.dispose();
}
@凌驾
小部件构建(构建上下文){
返回容器(
装饰:盒子装饰(颜色:颜色(0xFF8e80a8)),
子:列(
mainAxisAlignment:mainAxisAlignment.start,
mainAxisSize:mainAxisSize.min,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
新手势检测器(
onTap:(){
导航器。更换(
上下文
MaterialPage路由(生成器:(上下文)=>SecondScreen()),
);
},
孩子:填充(
填充:从LTRB(10,40,10,10)开始的常数边集,
子容器:新容器(
约束:BoxConstraints.expand(
高度:Theme.of(context).textTheme.display1.font
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,
              ),
            ),
          ),
        ],
      ),
    );
  }
}
flutterWebViewPlugin.show();