为StatelessWidget增加关闭事件

我在Flutter开发中使用GetX,所以几乎所有页面都是使用StatelessWidget。主要原因不是因为节省资源,而是觉得StatefullWidget每次得写两个类不好看……

StatelessWidget有个问题就是没有析构函数,那么如何在页面被释放时处理某些事件呢?这里提供一个我在用的方案,就是在StatelessWidget中增加GetxController对象。当StatelessWidget被释放时,GetxController自然也会被释放,同时触发其onClose事件。

class CloseController extends GetxController {
  @override
  void onInit() {
    print('CloseController onInit');
    super.onInit();
  }

  @override
  void onClose() {
    print('CloseController onClose');
    super.onClose();
  }
}

StatelessWidgetbuild接口中使用,例如:

class TestDialog extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    Get.put(CloseController(), tag: 'TestDialog');

    return Dialog(
        child: Container(
          width: 300,
          height: 300,
          color: Colors.amberAccent,
          child: ElevatedButton(onPressed: (){
            Get.back();
          }, child: Text('TestDialog close')),
        ));
  }
}

需要注意的是,一定要在build接口中创建这个CloseController对象!在构造函数等地方创建会并不会触发其onClose事件!

class TestDialog extends StatelessWidget{
  final closeController = Get.put(CloseController(), tag: 'TestDialog'); // 错误用法

  TestDialog({super.key}){
    Get.put(CloseController(), tag: 'TestDialog'); // 错误用法
  }
}

因为在构造函数中调用Get.put,控制器被注册到GetX的全局依赖池中,但没有与StatelessWidgetBuildContextwidget树关联,GetX无法知道控制器应该在StatelessWidget销毁时被清理。

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注