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