Flutter如何不修改全局配置禁用单页面Cupertino过渡解决Hero动画冲突
解决方案
不需要修改全局配置,以下两种方案都可以实现单路由禁用Cupertino页面转场:
方案1:直接修改跳转逻辑,自定义路由转场
跳转时手动指定优先级更高的自定义PageRoute,覆盖全局转场配置,示例代码如下:
InkWell( onTap: () { Navigator.of(context).push( PageRouteBuilder( pageBuilder: (context, animation, secondaryAnimation) => const ImageViewScreen(), // 自定义转场逻辑,这里直接返回child即仅保留Hero动画,无其他页面转场效果 transitionsBuilder: (context, animation, secondaryAnimation, child) => child, // 携带原参数 settings: RouteSettings(arguments: image), ), ); }, child: Hero( tag: '$image', child: Image.network( image.toString(), fit: BoxFit.fitHeight, ), ), )
如果需要保留除Cupertino转场外的其他系统转场,也可以把transitionsBuilder替换为Material默认转场实现即可。
方案2:保留命名路由用法,在路由拦截层单独配置
如果不想修改现有pushNamed调用逻辑,可以在MaterialApp的onGenerateRoute回调中针对ImageViewScreen路由单独配置转场:
MaterialApp( // 保留你原有的全局配置 theme: ThemeData( pageTransitionsTheme: const PageTransitionsTheme(builders: { TargetPlatform.iOS: CupertinoPageTransitionsBuilder(), TargetPlatform.android: CupertinoPageTransitionsBuilder(), }), ), // 新增onGenerateRoute配置 onGenerateRoute: (settings) { if (settings.name == ImageViewScreen.routeName) { return PageRouteBuilder( pageBuilder: (context, animation, secondaryAnimation) => const ImageViewScreen(), transitionsBuilder: (context, animation, secondaryAnimation, child) => child, settings: settings, ); } // 其他路由走默认逻辑 return null; }, // 你的其他原有配置 )
内容的提问来源于stack exchange,提问作者Dodo
相关产品推荐
相关产品推荐

