Flutter GetX Controller如何获取当前页面BuildContext以展示CoolAlert弹窗
解决方案
方法1:直接使用GetX内置全局Context(最推荐,无需额外传参)
GetX框架本身已经维护了全局的导航上下文,你直接把弹窗代码里的context替换成Get.context!即可直接使用,不需要修改原有页面代码,适配当前无状态组件的使用场景。修改后的控制器代码如下:
class HomePageController extends GetxController { @override void onInit() { super.onInit(); getData(); } void getData(){ // 执行http请求逻辑 CoolAlert.show( context: Get.context!, // 直接调用GetX内置全局上下文 type: CoolAlertType.success ); } }
方法2:调用方法时手动传入当前页面Context
如果你需要严格使用当前HomePage的专属Context,可以给getData方法新增Context入参,在页面build阶段调用方法时传入即可:
控制器修改代码
class HomePageController extends GetxController { @override void onInit() { super.onInit(); // 注意onInit阶段页面还未完成构建,拿不到页面Context,此处删除getData调用,移到页面中触发 } // 新增BuildContext入参 void getData(BuildContext context){ // 执行http请求逻辑 CoolAlert.show( context: context, type: CoolAlertType.success ); } }
页面修改代码
class HomePage extends StatelessWidget { HomePage({ Key? key }) : super(key: key); final _c = Get.find<HomePageController>(); @override Widget build(BuildContext context) { // 监听页面渲染完成回调,调用方法传入当前页面Context WidgetsBinding.instance.addPostFrameCallback((_) { _c.getData(context); }); return Container(); } }
注意:不建议在控制器中长期持有BuildContext,存在内存泄漏风险,优先选择方法1的全局Context方案,或者仅在调用方法时临时传参使用,不要把Context存为控制器的全局属性。
内容的提问来源于stack exchange,提问作者Geoff
相关产品推荐
相关产品推荐

