Flutter 等待页面转换完成

Flutter 等待页面转换完成,flutter,Flutter,如何检测页面转换是否在flutter中完成 背景:当我弹出到一个页面时,我想在页面转换完成后启动一个函数。您可以在推送新路由时注册回调,该路由也可以包含弹出路由中的数据,例如,如果您需要从它传递数据 Navigator.of(context).push(/*Some route*/).then((data) { // You can call your function here. data will be null if nothing is passed from the popped r

如何检测页面转换是否在flutter中完成


背景:当我弹出到一个页面时,我想在页面转换完成后启动一个函数。

您可以在推送新路由时注册回调,该路由也可以包含弹出路由中的数据,例如,如果您需要从它传递数据

Navigator.of(context).push(/*Some route*/).then((data) {
 // You can call your function here. data will be null if nothing is passed from the popped route
});
如果您想从弹出的路由传递
数据
,就这样做吧

Navigator.of(context).pop(someData);
编辑 如果您想知道转换何时真正结束,也可以为其注册回调侦听器

  Navigator.of(context).push(MaterialPageRoute(
          builder: (BuildContext context) => RouteWidget())
                   ..completed.then((_) {print('transition completed');},
          ),
  );

如果保留对路由的引用并使用didPush()TickerFuture,也可以等待推送转换

MaterialPageRoute route = MaterialPageRoute(builder: (context) => MyPage());
Navigator.of(context).push(route);
await route.didPush(); // you could also use then instead of await


// ROUTE FINISHED TRANSITION HERE 
如果您有多个堆叠导航器,并且希望它们之间的过渡更平滑,则可以使用此选项。例如,在弹出当前活动的Navigator 2以显示Navigator 1的页面之前,等待Navigator 1完成推送 是等待动画在第二页上完成(如果要在动画转换后更新页面,此选项非常有用)

第一页:

...
Navigator.push(
        context,
        PageRouteBuilder(
            transitionDuration: Duration(milliseconds: 3000), //optional but useful for testing
            pageBuilder: (_, animation, ___) => SecondPage(
                  pageBuilderAnimation: animation,
                )));
...
第二页:

class SecondPage extends StatefulWidget {
  const SecondPage ({Key? key, this.pageBuilderAnimation});

  final Animation<double>? pageBuilderAnimation;

  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {

  bool isTransitioning = true;


  @override
  void initState() {
    super.initState();

    if (widget.pageBuilderAnimation != null)
      widget.pageBuilderAnimation!.addListener(() {
        if (widget.pageBuilderAnimation!.isCompleted)
          setState(() => isTransitioning = false);
      });
    else
      isTransitioning = false;
  }
  ...
}


class SecondPage扩展StatefulWidget{
const SecondPage({Key?Key,this.pageBuilderAnimation});
最终动画?页面构建动画;
@凌驾
_SecondPageState createState()=>\u SecondPageState();
}
类_SecondPageState扩展状态{
布尔正在转换=真;
@凌驾
void initState(){
super.initState();
if(widget.pageBuilderAnimation!=null)
widget.pageBuilderAnimation!.addListener(){
if(widget.pageBuilderAnimation!.isCompleted)
设置状态(()=>isTransitioning=false);
});
其他的
isTransitioning=false;
}
...
}

但是
的回调。然后
在页面弹出后立即触发。它不会等待转换完成。