我希望我的页面每当进入页面时总是点击API。 例如,我有2个屏幕,即FirstSCreen和SecondScreen。 在FirstScreen中,我正在调用API来获取一些数据。因此,如果用户从FirstScreen导航到SecondScreen,然后通过按后退按钮返回FirstScreen,则它应再次在FirstScreen中点击API。
我想知道flutter中是否有任何内置函数,应该在其中调用我的方法,以便它每次进入屏幕时都可以工作。我已经尝试过使用 didUpdateWidget(),但是它不能按照我想要的方式工作。
initState()也仅在加载小部件时被调用。 请向我解释
答案 0 :(得分:3)
您可以使用async await
。假设您有一个更改路线的按钮。
onPressed: () async {
await Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SecondScreen(),
),
);
ApiCall();
},
仅当用户在第二个屏幕上向后推时,ApiCall
函数才会调用。
答案 1 :(得分:1)
我有一个例子可能会有所帮助。但是,它可能无法涵盖您的FirstScreen
总是会在调用来自其他页面/屏幕的页面后显示页面或专门恢复应用程序的所有情况(来自后台-请勿混淆)从另一个屏幕弹出或弹出)。
但是,我的示例在您从特定屏幕返回时始终会调用一个函数,您可以将其重新实现为其他导航功能,以确保在返回FirstScreen
时始终会调用特定函数在其他屏幕上。
main.dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
home_page.dart
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Center(
child: RaisedButton(
onPressed: () => Navigator.of(context)
.push(MaterialPageRoute(builder: (context) => SecondPage()))
.then((value) => _reload(value)),
child: Text('Navigate to Next Page'),
),
)
],
),
);
}
Future<void> _reload(var value) async {
print(
'Home Page resumed after popping/closing SecondPage with value {$value}. Do something.');
}
}
second_page.dart
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
Navigator.pop(context, 'Passed Value');
/// It's important that returned value (boolean) is false,
/// otherwise, it will pop the navigator stack twice;
/// since Navigator.pop is already called above ^
return false;
},
child: Scaffold(
appBar: AppBar(),
body: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Center(child: Text('Second Page')),
],
),
),
);
}
}