Flutter-页面出现时始终执行功能 [英] Flutter - Always execute a function when the page appears
问题描述
每当出现 Page1
页面时,如何运行 name()
函数?
How could I make the name()
function run whenever the Page1
page appeared?
在进入 Page2
之前的以下代码中,我执行 dispose()
已经在 Page2
内,如果我单击Android的后退按钮或物理按钮,功能 name()
不会执行,但是如果单击转到第1页
按钮,则会执行函数 name()
。
In the code below before going to Page2
I execute the dispose()
Already inside Page2
if I click the back button or the physical button of Android the function name()
is not executed, but if I click the 'go to Page1'
button the function name()
is executed.
能否帮助我在 Page1 $时始终执行
name()
函数c $ c>出现了吗?
Could you help me to always execute the name()
function when Page1
appears?
< img src = https://i.stack.imgur.com/eiHPv.gif alt =在此处输入图片描述>
import 'package:flutter/material.dart';
void main() {
runApp(new MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new MyHomePage(),
routes: <String, WidgetBuilder> {
'/page2': (BuildContext context) => new Page2(),
},
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String nameScreen;
String name() {
return 'foo1';
}
@override
void initState() {
super.initState();
this.nameScreen = name();
}
@override
void dispose() {
this.nameScreen = '';
super.dispose();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Page 1'),
backgroundColor: new Color(0xFF26C6DA),
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new RaisedButton(
child: const Text('go to Page2'),
onPressed: () async {
dispose();
bool isLoggedIn = await Navigator.of(context).pushNamed('/page2');
if (isLoggedIn) {
setState((){
this.nameScreen = name();
});
}
},
),
new Text(
'$nameScreen',
),
],
),
),
);
}
}
class Page2 extends StatelessWidget{
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Page 2'),
backgroundColor: new Color(0xFFE57373)
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new RaisedButton(
child: const Text('go back to Page1'),
onPressed: () {
Navigator.pop(context, true);
}
),
],
),
),
);
}
}
推荐答案
有当您愿意 pop
并更改 State <时,根本不需要调用
dispose
/ code>之后,因为 dispose
将从树中删除当前对象,这不会转换为您尝试开发的逻辑。
There is no need to call dispose
at all when you are willing to pop
and change State
later, since dispose
will remove the current object from the tree, which does not translate to the logic you are trying to develop.
您确实可以覆盖 BackButton
并传递 Navigator.pop(context,result)
。检查下面的示例,我对您的代码进行了一些调整,以向您展示您的 nameScreen
字段的每个 State
之间的区别。希望对您有帮助。
You can indeed override the BackButton
and pass the same call of Navigator.pop(context, result)
to it. Check the following example I have tweaked your code a little bit to show you the difference between each State
of your nameScreen
field. I hope this helps you.
< img src = https://i.stack.imgur.com/HD3Ci.gif alt =在此处输入图片描述>
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String nameScreen = "";
String name() {
return 'foo1';
}
@override
void initState() {
super.initState();
this.nameScreen = "From initState";
}
@override
void dipose(){
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Page 1'),
backgroundColor: Color(0xFF26C6DA),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: const Text('go to Page2'),
onPressed: () async {
//dispose(); ///No need for dispose
String result = await Navigator.of(context).pushNamed('/page2');
setState((){
this.nameScreen = result;
});
},
),
Text(
'$nameScreen',
),
],
),
),
);
}
}
class Page2 extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: IconButton(icon: Icon(Icons.arrow_back), onPressed: ()async{
Navigator.pop(context,"From BackButton");
}),
title: const Text('Page 2'),
backgroundColor: Color(0xFFE57373)
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
RaisedButton(
child: const Text('go back to Page1'),
onPressed: () {
Navigator.pop(context, "From RaisedButton");
}
),
],
),
),
);
}
这篇关于Flutter-页面出现时始终执行功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!