Flutter Getx重复跳转同页面时,如何重新创建控制器获取新状态?
解决Flutter GetX重复打开页面时复用控制器状态的问题
当使用GetX跳转至MovieDetails页面时,重复打开同一页面会默认复用已存在的MovieDetailsController实例,导致新页面继承旧页面的状态。以下是几种无需页面替换,即可实现每次打开页面都创建全新控制器的方案:
方案1:通过唯一Tag区分控制器
利用tag参数为每个页面的控制器分配唯一标识,确保每个页面绑定独立的控制器实例:
修改跳转代码
生成唯一tag(可结合页面参数或时间戳保证唯一性),并通过arguments传递:
// 生成唯一tag,示例用mediaType+时间戳避免重复 final String controllerTag = 'movie_details_${mediaType}_${DateTime.now().millisecondsSinceEpoch}'; Get.toNamed(AppRoutes.movieDetails, arguments: { 'media_type': mediaType, 'tag': controllerTag });
修改页面代码
从arguments中获取tag,在GetBuilder中指定tag并手动初始化控制器:
class MovieDetails extends StatelessWidget { const MovieDetails({Key? key}) : super(key: key); @override Widget build(BuildContext context) { final args = Get.arguments as Map<String, dynamic>; final String tag = args['tag']; return Scaffold( body: GetBuilder<MovieDetailsController>( tag: tag, init: MovieDetailsController(), // 为当前页面初始化全新控制器 builder: (controller) { // 此处编写页面UI逻辑,可通过controller访问全新状态 return Center(child: Text('Media Type: ${args['media_type']}')); }, ), ); } }
方案2:使用Get.create创建非单例控制器
Get.create会在每次调用时生成新的控制器实例,替代默认的单例模式:
修改页面代码
在GetBuilder的init参数中使用Get.create:
class MovieDetails extends StatelessWidget { const MovieDetails({Key? key}) : super(key: key); @override Widget build(BuildContext context) { final args = Get.arguments as Map<String, dynamic>; return Scaffold( body: GetBuilder<MovieDetailsController>( init: Get.create(() => MovieDetailsController()), // 每次创建全新控制器 builder: (controller) { return Center(child: Text('Media Type: ${args['media_type']}')); }, ), ); } }
方案3:路由绑定中创建新控制器
通过路由绑定(Bindings),确保每次跳转页面时都初始化新的控制器:
创建绑定类
class MovieDetailsBinding extends Bindings { @override void dependencies() { // 使用Get.create替代Get.put,每次生成新实例 Get.create(() => MovieDetailsController()); } }
关联路由与绑定
在路由表中为MovieDetails页面绑定上述类:
GetPage( name: AppRoutes.movieDetails, page: () => const MovieDetails(), binding: MovieDetailsBinding(), // 每次跳转执行绑定,创建新控制器 )
以上方案均可实现重复打开页面时获取全新的控制器状态,无需使用页面替换方式。
内容的提问来源于stack exchange,提问作者Mohammed Helewa
相关产品推荐
相关产品推荐

