简体   繁体   English

Flutter:在 getx controller 中使用 StateMixin 时使用 2 个类

[英]Flutter: use 2 classes when using StateMixin in getx controller

I am using getx as a statemanagement on my project.我在我的项目中使用 getx 作为状态管理。 I created a controller and I am using StateMixin on my controller.我创建了一个 controller 并在我的 controller 上使用 StateMixin。

class HomeController extends GetxController
    with StateMixin<MyModel, List<MyCompleteModel>> {

As you can see I want to use 2 classes by StateMixin .如您所见,我想使用StateMixin的 2 个类。 But it's constructor just accepts one class.但它的构造函数只接受一个 class。 Except create a new class that contains both of these classes, Is there any way to fix this problem?除了创建一个包含这两个类的新 class 之外,有没有办法解决这个问题?

Yes you can!是的你可以! And as you guessed it, by inheritance.正如你猜到的那样,通过继承。

At first create a generic State class containing the types you want:首先创建一个包含所需类型的通用 State 类:

class MyState<T1, T2> { // you can use more like T3, T4...
      T1? state1;
      T2? state2;

      MyState({this.state1, this.state2});
}

Then create a base controller of your own:然后创建自己的基本控制器:

abstract class BaseController<T1, T2> extends GetxController with StateMixin<MyState<T1, T2>> {

}

Then extend this base controller:然后扩展这个基本控制器:

class HomeController extends BaseController<int, String> {
      @override
      void onInit() {
         super.onInit();

         change(null, status: RxStatus.loading());

         Future.delayed(Duration(seconds: 3), () {
            change(MyState(state1:1,state2: "state2"), status:RxStatus.success());
    });
  }
}

Then on your widget:然后在您的小部件上:

controller.obx(
      (state) => Text("${state?.state1} - ${state?.state2}"),
    )

Yes you can by using tuple package.是的,您可以使用tuple package。 https://pub.dev/packages/tuple https://pub.dev/packages/tuple

class HomeController extends GetxController
    with StateMixin<Tuple2<MyModel, List<MyCompleteModel>>> {
  @override
  Future<void> onInit() async {
    change(Tuple2(MyModel(), [MyCompleteModel()]), status: RxStatus.success());
  }
}
class HomeView extends StatelessWidget {
  const HomeView({super.key});

  @override
  Widget build(BuildContext context) {
    final controller = Get.put(HomeController());
    return controller.obx((state) => Column(
      children: [
        Text(state?.item1.toString() ?? ''),
        Text(state?.item2.first.toString() ?? ''),
      ],
    ));
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM