我在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
销毁时被清理。