Flutter之基类逻辑 2025-04-21 周一

2025-04-22  本文已影响0人  松哥888

简介

上拉下拉

页面分类

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      behavior: HitTestBehavior.opaque,
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
      },
      child: GetBuilder<T>(
        tag: tag,
        builder: (_) {
          switch (pageType) {
            case PageType.scaffold:
              return _buildScaffold();
            case PageType.custom:
              return _buildCustom();
            case PageType.gradientNavigationBar:
              return _buildGradientNavigationBar();
            case PageType.refresh:
              return _buildRefresh();
          }
        },
      ),
    );
  }

1. 普通页面

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        FocusScope.of(Get.context!).requestFocus(FocusNode());
      },
      child: RepaintBoundary(
        child: Scaffold(
          backgroundColor: widget.backgroundColor ?? ColorUtils.c_f8f8f8,
          // backgroundColor: Colors.white,
          appBar: AppBar(
            flexibleSpace: Container(
              color: widget.flexibleSpaceColor ?? ColorUtils.c_ffffff,
            ),
            centerTitle: true,
            elevation: 0,
            backgroundColor: widget.backgroundColor ?? ColorUtils.c_ffffff,
            // backgroundColor: Colors.white,
            title: widget.title != null ? Text(widget.title!, style: StyleUtils.ts_1f_17_600) : widget.titleWidget,
            iconTheme: IconThemeData(color: ColorUtils.c_1f1f1f),
            leading: widget.leading,
            leadingWidth: widget.leadingWidth,
            actions: widget.actions,
            bottom: widget.bottom,
          ),
          body: widget.dataReady ? widget.body : buildEmptyWidget(),
          floatingActionButton: widget.floatingActionButton,
          floatingActionButtonLocation: widget.floatingActionButtonLocation,
        ),
      ),
    );
  }
abstract class BasePage<T extends BaseLogic> extends StatelessWidget {
  const BasePage({super.key, this.tag});

  final String? tag;

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

  @override
  Widget build(BuildContext context) {
    return GetBuilder<T>(
      tag: tag,
      builder: (_) {
        return _buildScaffold();
      },
    );
  }

  /// 重写这个切换页面类型
  final PageType pageType = PageType.scaffold;

  Widget _buildScaffold() {
    return GBScaffold(
      title: title,
      body: buildBody(),
      actions: buildActions(),
      bottom: buildBottom(),
    );
  }

  final String title = "";

  Widget buildBody() {
    return Container();
  }

  List<Widget>? buildActions() {
    return null;
  }

  PreferredSizeWidget? buildBottom() {
    return null;
  }
}

enum PageType {
  scaffold,
  custom,
}
Scaffold页面
class CartPage extends BasePage<CartLogic> {
  CartPage({super.key, super.tag}) {
    Get.put(CartLogic(), tag: tag);
  }

  @override
  String get title => "tab_cart".tr;

  @override
  Widget buildBody() {
    return Column(
      children: [
        messageRow(),
        logic.dataList.isNotEmpty
            ? Expanded(child: listWidget())
            : Expanded(
            child: Kong(
              img: R.assetsImgKongNocontent,
              title: logic.dataReady ? 'cart_empty_tip'.tr : "",
            )),
        operatorWidget(),
      ],
    );
  }

  @override
  PreferredSizeWidget? buildBottom() {
    return CartActionWidget(
      onEditClick: logic.onEditClick,
      onCouponClick: logic.onCouponClick,
      number: logic.productNumber,
      onFinishClick: logic.onFinishClick,
      showEdit: logic.showEdit,
    );
  }

2. 自定义页面

abstract class BasePage<T extends BaseLogic> extends StatelessWidget {
  const BasePage({super.key, this.tag});

  final String? tag;

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

  @override
  Widget build(BuildContext context) {
    return GetBuilder<T>(
      tag: tag,
      builder: (_) {
        switch (pageType) {
          case PageType.scaffold:
            return _buildScaffold();
          case PageType.custom:
            return buildCustom();
        }
      },
    );
  }

  /// 重写这个切换页面类型
  final PageType pageType = PageType.scaffold;

  /// 自定义页面
  Widget buildCustom() {
    return Container();
  }
}

enum PageType {
  scaffold,
  custom,
}

3. 渐变导航栏

灰色导航栏
  /// 渐变导航栏
  Widget _buildGradientNavigationBar() {
    return Scaffold(
      body: Stack(
        children: [
          buildBackground(),
          buildContent(),
          buildNavigationBar(),
        ],
      ),
    );
  }

  /// 第1层:背景
  Widget buildBackground() {
    return Image.asset(
      backgroundImageName,
      width: ScreenUtil().screenWidth,
      fit: BoxFit.fitWidth,
    );
  }

  /// 第2层内容
  Widget buildContent() {
    return NotificationListener(
      onNotification: (notification) {
        if (notification is ScrollUpdateNotification) {
          /// 监听滚动位置,导航栏渐变
          double scrollPosition = notification.metrics.pixels;
          logic.onScrollChange(scrollPosition);
        }
        return true;
      },
      child: CustomScrollView(
        slivers: buildSlivers(),
      ),
    );
  }



  /// 第3层:背景色渐变的导航栏
  Widget buildNavigationBar() {
    return Container(
      color: ColorUtils.c_f8f8f8.withValues(alpha: logic.alpha),
      child: Column(
        mainAxisSize: MainAxisSize.min,
        children: [
          SizedBox(height: GBUtils.getTopSafeHeight()),
          SizedBox(
            height: 44.r,
            child: Stack(
              children: [
                Container(
                  padding: EdgeInsets.symmetric(horizontal: 40.r),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Text(
                        title,
                        style: StyleUtils.ts_1f_17_600,
                        maxLines: 1,
                        overflow: TextOverflow.ellipsis,
                      ),
                    ],
                  ),
                ),
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    GestureDetector(
                      behavior: HitTestBehavior.opaque,
                      onTap: () {
                        Get.back();
                      },
                      child: Row(
                        children: [
                          SizedBox(width: 22.r),
                          Icon(
                            Icons.arrow_back_ios,
                            size: 22.r,
                            color: ColorUtils.c_000000,
                          ),
                          SizedBox(width: 22.r),
                        ],
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }

4. 下拉刷新的滑动视图

  /// 刷新视图
  Widget _buildRefresh() {
    return GBScaffold(
      title: title,
      actions: buildActions(),
      bottom: buildBottom(),
      body: Container(
        margin: margin,
        padding: padding,
        child: RefreshWidget(
          controller: logic.refreshController,
          onRefresh: logic.onRefresh,
          onLoad: logic.onLoad,
          isEmpty: logic.isEmpty,
          emptyWidget: buildEmpty(),
          isNetworkError: logic.isNetworkError,
          networkErrorWidget: buildNetworkError(),
          slivers: buildSlivers(),
        ),
      ),
    );
  }

  /// sliver类型的数组
  List<Widget> buildSlivers() {
    return [];
  }

  /// 空视图
  Widget? buildEmpty() {
    return null;
  }

  /// 网络错误
  Widget? buildNetworkError() {
    return null;
  }

5. 普通滑动视图

  /// 普通滑动:超出一屏滑动,否则不滑动
  Widget _buildSingleScroll() {
    return GBScaffold(
      title: title,
      actions: buildActions(),
      bottom: buildBottom(),
      body: Container(
        margin: margin,
        padding: padding,
        child: SingleChildScrollView(
          child: Column(
            children: buildChildren(),
          ),
        ),
      ),
    );
  }

  /// children数组
  List<Widget> buildChildren() {
    return [];
  }

6. 嵌套滑动

枚举类型

enum PageType {
  scaffold,
  custom,
  gradientNavigationBar,
  refresh,
  singleScroll,
  nestedScroll,
}
  /// 重写这个切换页面类型
  final PageType pageType = PageType.scaffold;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      behavior: HitTestBehavior.opaque,
      onTap: () {
        FocusScope.of(context).requestFocus(FocusNode());
      },
      child: GetBuilder<T>(
        tag: tag,
        builder: (_) {
          switch (pageType) {
            case PageType.scaffold:
              return _buildScaffold();
            case PageType.custom:
              return buildCustom();
            case PageType.gradientNavigationBar:
              return _buildGradientNavigationBar();
            case PageType.refresh:
              return _buildRefresh();
            case PageType.singleScroll:
              return _buildSingleScroll();
            case PageType.nestedScroll:
              return _buildNestedScroll();
          }
        },
      ),
    );
  }
上一篇 下一篇

猜你喜欢

热点阅读