我有一个主屏幕,显示标题图像和按钮路由到第二个屏幕,和一个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();
}
*/发布于 2019-01-08 20:52:50
一个解决方案是将"Navigator.push“更改为”Navigator.pushRemove“。这将意味着第一个屏幕不会再次出现,所以按后退按钮(至少在Android设备上)就会退出应用程序。这不完全是我想要做的,但会暂时奏效的。
如果有人能告诉我把“处置”的东西放在哪里,我还是很想知道!在此期间,我会继续努力。感谢那些在网上分享了这么多有用信息的人!
顺便提一下,这是新代码,稍微清理了一下:
导入‘WebView /Material.DAT’;ImportScreen.DAT‘;类WebView扩展StatefulWidget {@重写_WebViewState createState() => _WebViewState();}类_WebViewState扩展状态{ TextEditingController控制器=TextEditingController;FlutterWebviewPlugin flutterWebviewPlugin = FlutterWebviewPlugin();var urlString = "https://stackoverflow.com/questions/43692923/flutter-container-onpressed";launchUrl() { setState(() );();};}@重载initState() { super.initState();super.initState(){ print(wvs.type);} //这部分没有工作@重写super.dispose(){ _WebViewState();//关闭这里的super.dispose();} @override (BuildContext上下文){返回容器(装饰:BoxDecoration(颜色:颜色(0xFF8e80a8),子列( mainAxisAlignment: MainAxisAlignment.start,mainAxisSize: MainAxisSize.min,crossAxisAlignment: CrossAxisAlignment.center,子代:新GestureDetector( onTap:() ){ Navigator.pushReplacement(上下文),MaterialPageRoute(构建器:(上下文) => SecondScreen() );},子:填充(填充: const EdgeInsets.fromLTRB(10,40,10,10),子容器:新容器(约束: BoxConstraints.expand(高度:Theme.of(上下文).textTheme.display1.fontSize* 1.1 + 40.0,),子:新Image.asset(‘lib/assets/newoldralogo1menuBuon3.png’,对齐: Alignment.topCenter,fit: BoxFit.fitWidth,),),填充(填充: const EdgeInsets.all(10.0),容器(约束条件: BoxConstraints.expand(高度:Theme.of(上下文).textTheme.display1.fontSize* 1.1 + 250.0,),子容器: WebviewScaffold( url: urlString,withZoom: false,),),) );}}
发布于 2020-08-18 10:24:52
当用户导航到第二个屏幕时隐藏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/'),
),
),
)
]),
);
}
}https://stackoverflow.com/questions/54065095
复制相似问题