Flutter GetX 通过泛形自动注入依赖的二次封装

32 min read
import 'package:get/get.dart';
import 'package:flutter/cupertino.dart';

/// @class : GetCommonView
/// @name : jhf
/// @description :基类,用于绑定Controller
abstract class GetCommonView<T extends GetxController> extends StatefulWidget {

  const GetCommonView({ Key? key }) : super(key: key);

  final String? tag = null;

  T get controller => GetInstance().find<T>(tag: tag);

  ///Get 局部更新字段
  get updateId => null;

  @protected
  Widget build(BuildContext context);

  @override
  AutoDisposeState createState() => AutoDisposeState<T>();
}

/// @class : AutoDisposeState
/// @name : jhf
/// @description :基类,可自动装载的状态管理
class AutoDisposeState<S extends GetxController> extends State<GetCommonView> {
  AutoDisposeState();

  @override
  Widget build(BuildContext context) {
    return GetBuilder<S>(
        id: widget.updateId,
        builder: (controller) {
          return widget.build(context);
        });
  }

  @override
  void initState() {
    super.initState();
  }

  @override
  void dispose() {
    Get.delete<S>();
    super.dispose();
  }
}

使用,传入泛型,自动注入SearchController的依赖

class SearchPage extends GetCommonView<SearchController> {
  ///TextFieId控制器

  const SearchPage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      body: SafeArea(
        top: true,
        child: Column(
          children: [
            Box.vBox15,

            ///搜索框顶部Widget
            SearchTopWidget(
              onChanged: (text) {
                controller.changeText.value = text;
                if (text.isEmpty) {
                  controller.searchResult.value = [];
                }
              },
              onTap: () => controller.searchWord(),
              deleteTap: () {
                controller
                  ..changeText.value = ''
                  ..showResult.value = false
                  ..textController.text = ''
                  ..searchResult.value = [];
              },
              textController: controller.textController,
            ),
            Box.vBox15,

            Expanded(
              child: Stack(
                children: [
                  Column(
                    children: [
                      ///搜索历史
                      const SearchHistoryWidget(),
                      Box.vBox20,

                      ///搜索热词
                      const SearchHotWordWidget(),
                    ],
                  ),
                  const SearchResultWidget()
                ],
              ),
            )
          ],
        ),
      ),
    );
  }
}