You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 00:38:31