Flutter - 如何导航到异步值的另一个页面
Flutter - How to navigate to another page on an asynchronous value
我试图在应用程序初始启动时显示启动画面,直到我正确检索到所有数据。它一出现,我就想导航到应用程序的主屏幕。
不幸的是,我找不到触发 运行 那种导航的方法的好方法。
这是我用来测试这个想法的代码。具体来说,当变量 shouldProceed
变为真时,我想 运行 命令 Navigator.pushNamed(context, 'home');
。现在,我能想到的唯一方法是显示一个按钮,我需要按下它来触发导航代码:
import 'package:flutter/material.dart';
import 'package:catalogo/src/navigationPage.dart';
class RouteSplash extends StatefulWidget {
@override
_RouteSplashState createState() => _RouteSplashState();
}
class _RouteSplashState extends State<RouteSplash> {
ValueNotifier<bool> buttonTrigger;
bool shouldProceed = false;
_fetchPrefs() async { //this simulates the asynchronous function
await Future.delayed(Duration(
seconds:
1)); // dummy code showing the wait period while getting the preferences
setState(() {
shouldProceed = true; //got the prefs; ready to navigate to next page.
});
}
@override
void initState() {
super.initState();
_fetchPrefs(); // getting prefs etc.
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: shouldProceed
? RaisedButton(
onPressed: () {
print("entered Main");
Navigator.pushNamed(context, 'home'); // <----- I want this to be triggered by shouldProceed directly
},
child: Text("Continue"),
)
: CircularProgressIndicator(), //show splash screen here instead of progress indicator
),
);
}
}
所以,简而言之,当 shouldProceed 发生变化时,如何触发 运行 导航代码的函数?
您所要做的就是在获得首选项后,只需导航到屏幕并让构建方法构建一个进度指示器。
试试这个:
_fetchPrefs() async {
await Future.delayed(Duration(seconds: 1));
Navigator.of(context).pushNamed("home"); //stateful widgets give you context
}
这是您的新构建方法:
@override
Widget build(BuildContext context) {
return Center(child: CircularProgressIndicator());
}
我做了一个DartPad来说明:https://dartpad.dartlang.org/431fcd9a1ea5748a82506f13be042e85
创建一个可以显示或隐藏的小部件,类似于我的 ProgressBar 代码。根据计时器或 api 的数据加载完成时显示和隐藏。
ProgressBar progressBar = new ProgressBar();
progressBar.show(context);
Provider.of<Api>(context, listen: false)
.loadData(context, param)
.then((data) {
progressBar.hide();
Provider.of<Api>(context, listen: false).dataCache.login = loginValue;
Navigator.pop(context, true);
Navigator.pushNamed(context, "/home");
}
});
用启动画面替换 ProgressBar 代码:
class ProgressBar {
OverlayEntry _progressOverlayEntry;
void show(BuildContext context){
_progressOverlayEntry = _createdProgressEntry(context);
Overlay.of(context).insert(_progressOverlayEntry);
}
void hide(){
if(_progressOverlayEntry != null){
_progressOverlayEntry.remove();
_progressOverlayEntry = null;
}
}
OverlayEntry _createdProgressEntry(BuildContext context) =>
OverlayEntry(
builder: (BuildContext context) =>
Stack(
children: <Widget>[
Container(
color: Colors.white.withOpacity(0.6),
),
Positioned(
top: screenHeight(context) / 2,
left: screenWidth(context) / 2,
child: CircularProgressIndicator(),
)
],
)
);
double screenHeight(BuildContext context) =>
MediaQuery.of(context).size.height;
double screenWidth(BuildContext context) =>
MediaQuery.of(context).size.width;
}
我试图在应用程序初始启动时显示启动画面,直到我正确检索到所有数据。它一出现,我就想导航到应用程序的主屏幕。
不幸的是,我找不到触发 运行 那种导航的方法的好方法。
这是我用来测试这个想法的代码。具体来说,当变量 shouldProceed
变为真时,我想 运行 命令 Navigator.pushNamed(context, 'home');
。现在,我能想到的唯一方法是显示一个按钮,我需要按下它来触发导航代码:
import 'package:flutter/material.dart';
import 'package:catalogo/src/navigationPage.dart';
class RouteSplash extends StatefulWidget {
@override
_RouteSplashState createState() => _RouteSplashState();
}
class _RouteSplashState extends State<RouteSplash> {
ValueNotifier<bool> buttonTrigger;
bool shouldProceed = false;
_fetchPrefs() async { //this simulates the asynchronous function
await Future.delayed(Duration(
seconds:
1)); // dummy code showing the wait period while getting the preferences
setState(() {
shouldProceed = true; //got the prefs; ready to navigate to next page.
});
}
@override
void initState() {
super.initState();
_fetchPrefs(); // getting prefs etc.
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: shouldProceed
? RaisedButton(
onPressed: () {
print("entered Main");
Navigator.pushNamed(context, 'home'); // <----- I want this to be triggered by shouldProceed directly
},
child: Text("Continue"),
)
: CircularProgressIndicator(), //show splash screen here instead of progress indicator
),
);
}
}
所以,简而言之,当 shouldProceed 发生变化时,如何触发 运行 导航代码的函数?
您所要做的就是在获得首选项后,只需导航到屏幕并让构建方法构建一个进度指示器。
试试这个:
_fetchPrefs() async {
await Future.delayed(Duration(seconds: 1));
Navigator.of(context).pushNamed("home"); //stateful widgets give you context
}
这是您的新构建方法:
@override
Widget build(BuildContext context) {
return Center(child: CircularProgressIndicator());
}
我做了一个DartPad来说明:https://dartpad.dartlang.org/431fcd9a1ea5748a82506f13be042e85
创建一个可以显示或隐藏的小部件,类似于我的 ProgressBar 代码。根据计时器或 api 的数据加载完成时显示和隐藏。
ProgressBar progressBar = new ProgressBar();
progressBar.show(context);
Provider.of<Api>(context, listen: false)
.loadData(context, param)
.then((data) {
progressBar.hide();
Provider.of<Api>(context, listen: false).dataCache.login = loginValue;
Navigator.pop(context, true);
Navigator.pushNamed(context, "/home");
}
});
用启动画面替换 ProgressBar 代码:
class ProgressBar {
OverlayEntry _progressOverlayEntry;
void show(BuildContext context){
_progressOverlayEntry = _createdProgressEntry(context);
Overlay.of(context).insert(_progressOverlayEntry);
}
void hide(){
if(_progressOverlayEntry != null){
_progressOverlayEntry.remove();
_progressOverlayEntry = null;
}
}
OverlayEntry _createdProgressEntry(BuildContext context) =>
OverlayEntry(
builder: (BuildContext context) =>
Stack(
children: <Widget>[
Container(
color: Colors.white.withOpacity(0.6),
),
Positioned(
top: screenHeight(context) / 2,
left: screenWidth(context) / 2,
child: CircularProgressIndicator(),
)
],
)
);
double screenHeight(BuildContext context) =>
MediaQuery.of(context).size.height;
double screenWidth(BuildContext context) =>
MediaQuery.of(context).size.width;
}