我在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();
}
}
在StatelessWidget的build接口中使用,例如:
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的全局依赖池中,但没有与StatelessWidget的BuildContext或 widget树关联,GetX无法知道控制器应该在StatelessWidget销毁时被清理。
