【问题标题】:Flutter and Getx State Management - List View ChangesFlutter 和 Getx 状态管理 - 列表视图更改
【发布时间】:2021-10-07 04:27:04
【问题描述】:

使用 Flutter 和 Getx 状态管理创建一个购物应用。我不知道如何为列表中的每个元素创建一个控制器。因此,列表中特定元素的任何更改都将仅重新加载该元素,而不是整个列表重新加载。

如果我单击“新订单”容器,其他容器(“已确认订单”、“已完成”)也会重新构建(整个列表视图重新构建)。

我的模特:

import 'package:get/get.dart';

class TabModel {
  late String tabName;
  RxBool isSelected = false.obs;

  TabModel(this.tabName);
}

我的控制器:

import 'package:get/get.dart';
import 'package:super_mart_merchant/view/orders/view_models/tab_model.dart';
import 'package:collection/collection.dart';

class TabViewController extends GetxController{
  RxList<TabModel> tabModels = <TabModel>[].obs;
  @override
  void onInit() {
    super.onInit();
    loadVal('New Order',true);
    loadVal('Order Confirmed',false);
    loadVal('Order Declined',false);
    loadVal('Completed',false);
  }

  void loadVal(String name,bool isSelected){
    TabModel tabModel = TabModel(name);
    tabModel.isSelected.value = isSelected;
    tabModels.add(tabModel);
  }

  void onClick(int pos){
    TabModel tabModel =   tabModels[pos];
    if(!tabModel.isSelected.value){
      TabModel? previousTabModel =  tabModels.firstWhereOrNull((element) => element.isSelected.value);
      if(previousTabModel != null){
        previousTabModel.isSelected.value = false;
      }
      tabModel.isSelected.value = true;

    }

  }
}

绑定:

import 'package:get/get.dart';
import 'package:super_mart_merchant/view/orders/controllers/tab_controller.dart';

class TabControllerBinding implements Bindings{
  @override
  void dependencies() {
    Get.lazyPut<TabViewController>(() => TabViewController());

  }
}

查看:

class TabView extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return GetX<TabViewController>(
      builder: (TabViewController tabController) {
        print('Object called : ${tabController.toString()}');
        return Container(
          height: 55,
          alignment: Alignment.center,
          child: ListView.builder(
            scrollDirection: Axis.horizontal,
            itemBuilder: (ctx, int index) {
              if (tabController.tabModels[index].isSelected.value) {
                return SelectedOrderStatusComponents(
                    tabController.tabModels[index],
                    index);
              }
              return GestureDetector(
                onTap: (){
                  tabController.onClick(index);
                },
                child: UnSelectedOrderStatusComponents(
                    tabController.tabModels[index],
                    index),
              );
            },
            itemCount: tabController.tabModels.length,
          ),
        );
      },
    );
  }
}

在 Provider 中,我们有这方面的选项。我不知道如何在 Getx 中做到这一点。非常感谢!!!。

【问题讨论】:

    标签: flutter dart get flutter-getx


    【解决方案1】:

    这是我第一次在这里回答,所以我希望它符合标准,也为您解决问题还为时不晚。 对于您的第一个问题:希望在选项卡中导航后不重建每个选项卡。您可以将 Tab 小部件转换为 Stateful 小部件并添加 AutomaticKeepAliveClientMixin 以防止它在导航后重建。像这样的:

    class TabView extends StatefulWidget {
      TabView ({Key? key}) : super(key: key);
    
      @override
      _TabViewState createState() => _TabViewState();
    }
    
    class _TabViewState extends State<TabView>
        with AutomaticKeepAliveClientMixin {
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return Container();
      }
      
      @override
      bool get wantKeepAlive => true;
    }
    

    对于您的第二个问题,要重新加载项目而不是整个列表,您可以将每个项目包装在 ObxGetBuilder 中,并根据每个项目的索引或 ID 给它一个标签,但我不建议这样做,因为 GetX 的重建速度非常快,它只会在更改的地方重建,并且一页中有太多 GetBuilder 会影响性能。

    return GestureDetector(
         onTap: (){
              tabController.onClick(index);
         },
         child: GetBuilder<TabViewController>(
              id: "item" + tabController.tabModels[index].id,
              builder: (controller) {
                  return UnSelectedOrderStatusComponents(
                       tabController.tabModels[index],
                       index);
              }
         )
    );
    

    【讨论】:

    • 抱歉回复晚了。感谢您的宝贵回答。根据您的第二个答案,我已经解决了我的问题。用 GetX 包装每个项目而不是整个列表。
    猜你喜欢
    • 2021-08-20
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2021-11-06
    • 2022-10-23
    • 2021-09-04
    相关资源
    最近更新 更多