GetX是一个很强大的框架,主要是三大核心功能:状态管理、路由管理、依赖管理。
除此之外还有很多功能:国际化、Dialog、SnackBar、甚至是网络请求框架等等。
最近在学习过程中,遇到一个常见需求:如下图,主页切换的时候‘首页’和‘我的’需要保活,不要重复build导致页面频繁刷新。
一般这种需求我们使用AutomaticKeepAliveClientMixin就很容易解决,但这只能支持StatefulWidget,GetX的页面是一般是使用GetView,看一下GetView的源码:
abstract class GetView<T> extends StatelessWidget {
const GetView({Key? key}) : super(key: key);
final String? tag = null;
T get controller => GetInstance().find<T>(tag: tag)!;
@override
Widget build(BuildContext context);
}
由于GetView是StatelessWidget,因此我们无法直接使用AutomaticKeepAliveClientMixin,会报错。
这里提供一个思路,只需要再处理一层,将GetView当作是StatefulWidget下面的一个View就可以了,如有更好的方法,欢迎留言。
示例代码如下:
/// Page - StatefulWidget
class TestPage extends StatefulWidget {
TestPage({Key? key}) : super(key: key);
@override
_TestPageState createState() => _TestPageState();
}
/// Page - State with AutomaticKeepAliveClientMixin
class _TestPageState extends State<TestPage>
with AutomaticKeepAliveClientMixin {
@override
Widget build(BuildContext context) {
return TestView();
}
@override
bool get wantKeepAlive => true;
}
/// GetView
class TestView extends GetView<TestController> {
@override
Widget build(BuildContext context) {
return Scaffold(body: Text('TestPage'));
}
}
/// Controller
class TestController extends GetxController {
}