有没有办法在 Flutter 的 TabBar 中禁用过早的数据提取?

问题描述 投票:0回答:0

我们有一个包含 6-7 个选项卡的页面。 每当我们切换选项卡时,都会获取相应的数据。 现在的问题是,如果用户轻轻触摸选项卡,使选项卡不会完全切换并返回,则下一个选项卡中的数据会在当前选项卡中获取。

我试过改变 tabbarview 的物理特性。

有没有办法确保只有在完全切换选项卡时才获取数据?

这是代码,

在我的订单控制器中,

late TabController tabController;
tabController = TabController(length: 7, vsync: this);

在我的订单屏幕中,

TabBar(
            controller: orderController.tabController,
            onTap: (index) {
              searchController.searchText.value.clear();
            },
            isScrollable: true,
            labelPadding: EdgeInsets.symmetric(horizontal: 8.w),
            indicatorSize: TabBarIndicatorSize.tab,
            labelColor: Constants.TextBlack,
            unselectedLabelColor: Constants.TextBlack,
            indicatorWeight: 3.h,
            indicatorColor: Constants.BackgroundBlue,
            labelStyle: ThemeStyles.NormalBold,
            tabs: [
              Tab(
                child: Text('All', style: ThemeStyles.NormalBold),
              ),
              Tab(
                child: Text('Unfulfilled', style: ThemeStyles.NormalBold),
              ),
              Tab(
                child: Text('Fulfilled', style: ThemeStyles.NormalBold),
              ),
              Tab(
                child: Text('Partially Refunded', style: ThemeStyles.NormalBold),
              ),
              Tab(
                child: Text('Refunded', style: ThemeStyles.NormalBold),
              ),
              Tab(
                child: Text('Hold', style: ThemeStyles.NormalBold),
              ),
              Tab(
                child: Text('Dispute', style: ThemeStyles.NormalBold),
              ),
            ],
          ),
        ),
        SizedBox(height: 4.h),
        Expanded(
          child:
          TabBarView(
            controller: orderController.tabController,
            children: const [
              AllOrdersView(),
              AllOrdersView(status: 0),
              AllOrdersView(status: 1),
              AllOrdersView(status: 4),
              AllOrdersView(status: 3),
              AllOrdersView(status: 9),
              AllOrdersView(status: 10),
            ],
          ),

在 AllOrderView() 中,

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';

class AllOrdersView extends StatefulWidget {
  final int? status;
  const AllOrdersView({Key? key, this.status}) : super(key: key);
  @override
  State<AllOrdersView> createState() => _AllOrdersViewState();
}

class _AllOrdersViewState extends State<AllOrdersView> with TickerProviderStateMixin
{
  bool isLoadingFirst = false;
  bool isLoading = false;
  int page = 1;
  int totalPages = 0;
  RefreshController paginateController = RefreshController();
  AllOrdersModel? orderModel = AllOrdersModel();
  List<OrderDatum> ordersList = [];
  final controller = Get.find<OrderController>();

  Future<void> fetchOrders() async {
    widget.status != null ? await controller.fetchOrdersList(isFirst: true, status: widget.status) : await controller.fetchAllOrdersList(isFirst: true);
  }

  late AnimationController animationController;
  late AnimationController animationController2;

  @override
  void initState() {
    super.initState();
    animationController = AnimationController(vsync: this);
    animationController2 = AnimationController(vsync: this);
    WidgetsBinding.instance!.addPostFrameCallback((_) {
      fetchOrders();
    });
  }

  @override
  void setState(VoidCallback fn) {
    if (mounted) {
      super.setState(fn);
    }
  }

  @override
  void dispose() {
    animationController.dispose();
    animationController2.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
      SizedBox(height: 8.h),
      widget.status != null
          ? Obx(() => controller.firstLoading.value == true
              ? Expanded(child: AlertWidgets.IULoading(animationController1: animationController, animationController2: animationController2))
              : controller.allOrdersList.value.isEmpty
                  ? SizedBox(
                      height: 50.h,
                      width: Get.width,
                      child: Center(child: Text("No orders found", style: ThemeStyles.NormalBold)),
                    )
                  : Expanded(
                      child: ExcludeSemantics(
                        child: SmartRefresher(
                          controller: paginateController,
                          enablePullUp: true,
                          // enablePullDown: true,
                          enablePullDown: false,
                          onRefresh: () async {
                            controller.searchOrder.value = "";
                            if (totalPages >= page) {
                              await controller.fetchOrdersList(isFirst: true, status: widget.status);
                              if (controller.loading.value == false) {
                                paginateController.loadComplete();
                              } else {
                                paginateController.loadFailed();
                              }
                            } else {
                              paginateController.loadNoData();
                            }
                          },
                          onLoading: () async {
                            if (totalPages >= page) {
                              await controller.fetchOrdersList(isFirst: false, status: widget.status);
                              if (controller.loading.value == false) {
                                paginateController.loadComplete();
                              } else {
                                paginateController.loadFailed();
                              }
                            } else {
                              paginateController.loadNoData();
                            }
                          },
                          child: ListView.builder(
                              shrinkWrap: true,
                              physics: const BouncingScrollPhysics(),
                              padding: EdgeInsets.zero,
                              itemCount: controller.allOrdersList.value.length,
                              itemBuilder: (context, index) {
                                var item = controller.allOrdersList.value[index];
                                return OrderCard(
                                  orderDatum: item,
                                  status: widget.status,
                                );
                              }),
                        ),
                      ),
                    ))
          : Obx(
              () => controller.firstLoading.isTrue
                  ? Expanded(child: AlertWidgets.IULoading(animationController1: animationController, animationController2: animationController2))
                  : controller.allOrdersList.isEmpty
                      ? SizedBox(
                          height: 50.h,
                          width: Get.width,
                          child: Center(child: Text("No orders found", style: ThemeStyles.NormalBold)),
                        )
                      : Expanded(
                          child: ExcludeSemantics(
                            child: SmartRefresher(
                              controller: paginateController,
                              enablePullUp: true,
                              enablePullDown: true,
                              onRefresh: () async {
                                controller.searchOrder.value = "";
                                await controller.fetchAllOrdersList(isFirst: true);
                                if (controller.firstLoading.value == false) {
                                  paginateController.loadComplete();
                                } else {
                                  paginateController.loadFailed();
                                }
                              },
                              onLoading: () async {
                                if (controller.totalPages.value >= controller.page.value) {
                                  await controller.fetchAllOrdersList(isFirst: false);
                                  if (controller.loading.value == false) {
                                    paginateController.loadComplete();
                                  } else {
                                    paginateController.loadFailed();
                                  }
                                } else {
                                  paginateController.loadNoData();
                                }
                              },
                              child: ListView.builder(
                                  shrinkWrap: true,
                                  physics: const BouncingScrollPhysics(),
                                  padding: EdgeInsets.zero,
                                  itemCount: controller.allOrdersList.length,
                                  itemBuilder: (context, index) {
                                    var item = controller.allOrdersList[index];
                                    return OrderCard(
                                      orderDatum: item,
                                    );
                                  }),
                            ),
                          ),
                        ),
            ),
    ]);
  }
  
}
flutter dart flutter-animation tabbar
© www.soinside.com 2019 - 2024. All rights reserved.