我写了一些检查,然后在条件为真的情况下导航到下一页。但是,只要该条件返回true,我就会不断收到错误消息,并且我打算进行导航
class BuyTickets extends StatefulWidget {
@override
_BuyTicketsState createState() => new _BuyTicketsState();
}
class _BuyTicketsState extends State<BuyTickets> {
@override
void initState(){
...
if(condition){
//Skip to next page
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => SelectSeat(data: widget.data)
)
);
}
super.initState();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
...
)
}
错误:
请问我该如何解决?
答案 0 :(得分:2)
它抱怨找不到父对象,因为与小部件关联的渲染对象未完全创建和安装。
在所有这些情况下,您都需要将调用延迟到装入渲染对象的那一刻。一种方法是在第一帧之后执行它。
@override
void initState() {
super.initState();
if(condition){
WidgetsBinding.instance.addPostFrameCallback((_) async {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => SelectSeat(data: widget.data)
)
);
});
}
}
答案 1 :(得分:0)
您无法在initState()
或build()
之类的生命周期功能中进行导航。您可以将登录信息置于async
函数中,或使用Future.delayed
或类似名称。
@override
void initState(){
super.initState();
...
if(condition){
skipToNextPage();
}
}
void skipToNextPage() async {
Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => SelectSeat(data: widget.data)
)
);
}
答案 2 :(得分:0)
这件事也发生在我身上。就我而言,这是一个在打开小部件时立即影响图形的操作。因此,我只将立即对图形产生影响的部分延迟了一秒钟
@override
Widget build(BuildContext context) {
return ScopedModelDescendant<UserModel>(
builder: (BuildContext context, Widget child, UserModel userModel) {
//HERE
Future.delayed(Duration(seconds: 1)).then((s) {
showDialogStateSheet(context, userModel);
});...