Flutter:导航背景固定在顶部,下拉分页布局


view

js 复制代码
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';
import 'package:happy/common/index.dart';
import 'index.dart';

class NoticeListPage extends GetView<NoticeListController> {
  const NoticeListPage({super.key});

  // tab 切换
  Widget _buildTab() {
    return <Widget>[
      TextWidget.body('平台公告',size: 30.sp,color: AppTheme.color000,),
      SizedBox(width: 50.w,),
      TextWidget.body('系统消息',size: 30.sp,color: AppTheme.color999,),
    ].toRow()
    .paddingHorizontal(30.w)
    .height(88.w);
  }

  // 数据列表
  Widget _buildDataList() {
    return SmartRefresher(
      controller: controller.refreshController,
      enablePullUp: true,
      onRefresh: controller.onRefresh,
      onLoading: controller.onLoading,
      footer: const SmartRefresherFooterWidget(),
      header: const SmartRefresherHeaderWidget(),
      child: ListView.builder(
        itemBuilder: (context, index) {
          return <Widget>[
            TextWidget.body('happy交易所全新上线啦!',size: 28.sp,color: AppTheme.color000,overflow: TextOverflow.ellipsis,maxLines: 1,),
            SizedBox(height: 20.w,),
            TextWidget.body('交易所全新上线交易所全新上线交易所全新上线交易所全新上线交易所全新上线交易所全新上线交易所全新上线交易所全新上线交易所全新上线',size: 24.sp,color: AppTheme.color999,overflow: TextOverflow.ellipsis,maxLines: 2,),
            SizedBox(height: 30.w,),
            <Widget>[
              TextWidget.body('2020.05.12 12:30',size: 20.sp,color: AppTheme.color999,),
              <Widget>[
                TextWidget.body('查看全部',size: 20.sp,color: AppTheme.color999,),
                Icon(TDIcons.chevron_right,size: 24.sp,color: AppTheme.color999,),
              ].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween)
            ].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween)
          ].toColumn(crossAxisAlignment: CrossAxisAlignment.start)
          .paddingAll(30.w)
          .decorated(
            border: Border.all(width: 1,color: AppTheme.dividerColor2),
            color: AppTheme.blockBgColor,
            borderRadius: BorderRadius.circular(10.w)
          )
          .marginOnly(bottom: 20.w,left: 30.w,right: 30.w)
          .onTap(() {
            Get.toNamed('/noticeDetailPage');
          });
        },
        itemCount: 20,
      ),
    );
  }

  // 主视图
  Widget _buildView() {
    // 系统状态栏占位高度
    double systemStatusBarHeight = MediaQuery.of(Get.context!).padding.top;
    // 总占位高度
    double systemTotalHeight = 44 + systemStatusBarHeight;
    return <Widget>[
      SizedBox(height: systemTotalHeight,),
      _buildTab(),
      _buildDataList().expanded(),
    ].toColumn();
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<NoticeListController>(
      init: NoticeListController(),
      id: "notice_list",
      builder: (_) {
        return Scaffold(
          backgroundColor: AppTheme.pageBgColor, // 自定义颜色
          body: <Widget>[
            ImgWidget(path: 'assets/images/home10.png',width: 750.w,height: 500.w,),
            _buildView().expanded(),
            TDNavBar(
              height: 44,
              title: '消息详情',
              titleColor: AppTheme.color000,
              titleFontWeight: FontWeight.w600,
              backgroundColor: Colors.transparent,
              screenAdaptation: true,
              useDefaultBack: false,
              leftBarItems: [
                TDNavBarItem(
                  icon: TDIcons.chevron_left,
                  iconSize: 24,
                  iconColor: AppTheme.color000,
                  action: () {
                    Get.back();
                  }
                ),
              ],
            ),
          ].toStack(),
        );
      },
    );
  }
}

controller

js 复制代码
import 'package:get/get.dart';
import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
// import 'package:happy/common/index.dart';

class NoticeListController extends GetxController {
  NoticeListController();

  // 查看详情
  void goNoticeDetail(String id) {
    Get.toNamed('/noticeDetailPage',arguments: {'id': id});
  }

  List items = [];

  /*
  * 分页
  * refreshController:分页控制器
  * _page:分页
  * _limit:每页条数
  * _loadNewsSell:拉取数据(是否刷新)
  * onLoading:上拉加载新商品
  * onRefresh:下拉刷新
  * */
  final RefreshController refreshController = RefreshController(
    initialRefresh: true,
  );
  // int _page = 1;
  Future<bool> _loadNewsSell(bool isRefresh) async {
    return false;
    // var result = await HomeApi.noticesList(PageListReq(
    //   pageNo:isRefresh ? 1:_page,
    //   pageSize:20
    // ));
    // if(isRefresh){
    //   _page = 1;
    //   items.clear();
    // }
    // if(result.isNotEmpty){
    //   _page++;
    //   items.addAll(result);
    // }
    // // 是否是空
    // return result.isEmpty;
  }

  // 上拉载入新商品
  void onLoading() async {
    if (items.isNotEmpty) {
      try {
        // 拉取数据是否为空 ? 设置暂无数据 : 加载完成
        var isEmpty = await _loadNewsSell(false);
        isEmpty
            ? refreshController.loadNoData()
            : refreshController.loadComplete();
      } catch (e) {
        refreshController.loadFailed(); // 加载失败
      }
    } else {
      refreshController.loadNoData(); // 设置无数据
    }
    update(["goods_list"]);
  }

  // 下拉刷新
  void onRefresh() async {
    try {
      await _loadNewsSell(true);
      refreshController.refreshCompleted();
    } catch (e) {
      refreshController.refreshFailed();
    }
    update(["notice_list"]);
  }



  _initData() {
    update(["notice_list"]);
  }


  @override
  void onReady() {
    super.onReady();
    _initData();
  }

  @override
  void onClose() {
    super.onClose();
    refreshController.dispose();
  }
}
相关推荐
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
李少兄2 天前
JavaScript 隐式全局变量解析
javascript
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超2 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int2 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端