import 'package:electronic_assistant/base/base_page.dart'; import 'package:electronic_assistant/module/store/view.dart'; import 'package:electronic_assistant/resource/assets.gen.dart'; import 'package:electronic_assistant/resource/colors.gen.dart'; import 'package:electronic_assistant/resource/string.gen.dart'; import 'package:electronic_assistant/utils/expand.dart'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import '../../utils/fixed_size_tab_indicator.dart'; import 'controller.dart'; class HomePage extends BasePage { const HomePage({super.key}); @override Color backgroundColor() { return '#F6F5F8'.color; } @override double? pageHeight() { return double.infinity; } @override Widget buildBody(BuildContext context) { return Stack( children: [ buildBgBox(), SafeArea( bottom: false, child: Column( children: [ Container( width: 1.sw, padding: const EdgeInsets.all(12).w, child: buildOperationBar(), ), Expanded( child: DefaultTabController( length: controller.tabList.length, child: NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return [ SliverToBoxAdapter(child: _buildHeaderView()), SliverPersistentHeader( floating: true, pinned: true, delegate: CommonSliverHeaderDelegate( backgroundColor: '#F6F5F8'.color, child: PreferredSize( preferredSize: const Size(double.infinity, 52), child: _buildTabBar()))), ]; }, body: _buildHomeTabView())), ), ], ), ), ], ); } Widget _buildTabBar() { return TabBar( padding: EdgeInsets.only(left: 12.w, bottom: 6.h), tabAlignment: TabAlignment.start, labelPadding: EdgeInsets.only(right: 32.w), isScrollable: true, indicator: FixedSizeTabIndicator( width: 11.w, height: 4.w, radius: 17, color: ColorName.colorPrimary), dividerHeight: 0, unselectedLabelStyle: TextStyle(fontSize: 16.sp, color: '#7C8191'.color), labelStyle: TextStyle( fontSize: 16.sp, color: ColorName.primaryTextColor, fontWeight: FontWeight.bold), tabs: controller.tabList.map((bean) => Tab(text: bean.title)).toList(), ); } Widget _buildHomeTabView() { return TabBarView(children: controller.tabList.map((e) => e.view).toList()); } @override bool immersive() { return true; } Widget _buildHeaderView() { return Container( padding: EdgeInsets.only(left: 12.w, right: 12.w, top: 8.h, bottom: 8.h), child: getHomeHeadView( key: controller.headGuideKey, recordClick: () { controller.onRecordClick(); }, pickerAudioFileClick: () { controller.onPickerAudioFile(); }, ), ); } // SliverToBoxAdapter buildSeeMoreView() { // return SliverToBoxAdapter( // child: Obx(() { // return Visibility( // visible: controller.agendaList.isNotEmpty, // child: Container( // alignment: Alignment.center, // padding: EdgeInsets.only( // top: 12.w, bottom: 56.w + Constants.bottomBarHeight), // child: RichText( // text: TextSpan( // text: StringName.homeTalkTodo1.tr, // style: TextStyle( // color: ColorName.secondaryTextColor, fontSize: 12.sp), // children: [ // TextSpan( // text: StringName.homeTalkTodo2.tr, // style: TextStyle( // color: ColorName.colorPrimary, fontSize: 12.sp), // recognizer: TapGestureRecognizer() // ..onTap = () { // controller.onGoAgendaList(); // }), // ], // ), // ), // ), // ); // }), // ); // } // SliverToBoxAdapter buildTalkTodoTitle() { // return SliverToBoxAdapter( // child: Container( // decoration: BoxDecoration( // gradient: LinearGradient( // begin: Alignment.topCenter, // end: Alignment.bottomCenter, // colors: ["#FCFBFC".toColor(), "#F6F5F8".toColor()], // ), // ), // child: Column( // children: [ // SizedBox(height: 12.w), // buildTitle(StringName.talkSummaryTodoTitle.tr, () { // controller.onGoAgendaList(); // }), // SizedBox(height: 12.w) // ], // ), // )); // } // // SliverToBoxAdapter buildTalkRecordTitle() { // return SliverToBoxAdapter( // child: Container( // decoration: BoxDecoration( // gradient: LinearGradient( // begin: Alignment.topCenter, // end: Alignment.bottomCenter, // colors: [ColorName.white, "#FEFEFE".toColor()], // ), // ), // padding: const EdgeInsets.symmetric(vertical: 12).w, // child: buildTitle(StringName.homeTalkRecord.tr, () { // controller.goTalkRecordPage(); // }), // ), // ); // } Row buildOperationBar() { return Row(children: [buildGoLogin(), const Spacer(), buildGoStore()]); } GestureDetector buildGoStore() { return GestureDetector( child: Container( decoration: BoxDecoration( gradient: LinearGradient( colors: ['#FFD3A8'.color, '#FFEDE1'.color, '#FFDBC2'.color], stops: const [0, 0.5, 1.0], begin: Alignment.bottomLeft, end: Alignment.topRight, ), borderRadius: BorderRadius.circular(100), ), padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8).w, child: Text(StringName.homeChargeTxt.tr, style: TextStyle( height: 1, fontSize: 13.sp, color: '#773C23'.color, fontWeight: FontWeight.bold)), ), onTap: () { // accountRepository.logout(); // ToastUtil.showToast('GoStore'); StorePage.start(fromType: StoreFromType.home); }); } Widget buildGoLogin() { return Obx(() { return GestureDetector( onTap: () { if (controller.isLogin) { controller.showLoginDrawer(); } else { controller.onLoginClick(); } }, child: Container( color: ColorName.transparent, child: Row( children: [ SizedBox( width: 36.w, height: 36.w, child: controller.isLogin ? Assets.images.iconHomeLogged.image() : Assets.images.iconHomeNoLogin.image()), SizedBox(width: 8.w), Text(controller.loginTxt, style: TextStyle( fontWeight: FontWeight.bold, fontSize: 15.sp, color: ColorName.primaryTextColor)), SizedBox(width: 6.w), controller.isLogin ? const SizedBox.shrink() : SizedBox( height: 16.w, child: Assets.images.iconGoLoginArrow.image()) ], ), ), ); }); } Widget buildBgBox() { return AspectRatio( aspectRatio: 360 / 188, child: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: ['#CDD1FA'.color, '#FAFFFF'.color, '#F6F5F8'.color], ), ), ), ); } // Widget buildTalkRecord() { // return SizedBox( // width: 1.sw, // child: CustomScrollView( // scrollDirection: Axis.horizontal, // slivers: [ // SliverToBoxAdapter(child: SizedBox(width: 12.w)), // Obx(() { // return SliverList.builder( // itemBuilder: _builderTalkItem, // itemCount: controller.talkList.length >= 10 // ? 10 // : controller.talkList.length); // }), // ], // ), // ); // } // // Widget _builderTalkItem(BuildContext context, int index) { // return Obx(() { // TalkBean? item = controller.talkList[index]; // return _buildTalkView(item, onLongPressStart: (details) { // if (!accountRepository.isLogin.value) { // return; // } // showTalkPopup(details.globalPosition, Alignment.bottomRight, // onRename: () { // showRenameTalkDialog(item); // }, onDelete: () { // showDeleteTalkDialog(item); // }); // }, onItemClick: () { // controller.onTalkItemClick(item); // }); // }); // } // Widget _builderAgendaItem(BuildContext context, int index) { // return Obx(() { // Agenda item = controller.agendaList[index]; // return GestureDetector( // onTap: () { // controller.onAgendaItemClick(item); // }, // child: taskItemView( // item, // onThinkingClick: () { // ChatPage.startByTalkId( // item.isExample == true // ? ChatFromType.fromTalkExample // : ChatFromType.fromAnalysisBtn, // item.talkId, // agenda: item); // }, // onCheckClick: () { // controller.agendaComplete(item); // }, // ), // ); // }); // } // SliverToBoxAdapter buildGoRecordView() { // return SliverToBoxAdapter( // child: GestureDetector( // onTap: () => Get.toNamed(RoutePath.record), // child: Container( // margin: EdgeInsets.only(right: 8.w), // decoration: BoxDecoration( // color: Colors.white, // border: Border.all(color: '#EBEBFF'.toColor(), width: 1), // borderRadius: BorderRadius.circular(8.0), // ), // child: SizedBox( // width: 100.w, // height: double.infinity, // child: Stack( // children: [ // Positioned( // right: 0, // bottom: 0, // child: SizedBox( // width: 48.w, // child: Assets.images.bgHomeQuickAudio.image(), // ), // ), // Positioned.fill( // child: Align( // alignment: Alignment.center, // child: Column( // children: [ // SizedBox(height: 20.h), // SizedBox( // width: 32.w, // height: 32.w, // child: Assets.images.iconAddTalk.image()), // SizedBox(height: 6.h), // Text(StringName.homeTalkAudio.tr, // style: TextStyle( // fontSize: 14.sp, // color: ColorName.colorPrimary, // fontWeight: FontWeight.bold)), // Builder(builder: (context) { // controller.todoTargetContext = context; // return Text(StringName.homeTalkQuickAudio.tr, // style: TextStyle( // fontSize: 10.sp, // color: ColorName.secondaryTextColor)); // }) // ], // ), // )), // ], // ), // ), // ), // )); // } // Widget _buildTalkView(TalkBean item, // {VoidCallback? onItemClick, // GestureLongPressStartCallback? onLongPressStart}) { // return GestureDetector( // onTap: onItemClick, // onLongPressStart: onLongPressStart, // child: Container( // width: 258.w, // margin: EdgeInsets.only(right: 8.w), // decoration: BoxDecoration( // color: Colors.white, // border: Border.all(color: '#F0F0F0'.toColor(), width: 2), // borderRadius: const BorderRadius.only( // topLeft: Radius.circular(12), // topRight: Radius.circular(24), // bottomRight: Radius.circular(12), // bottomLeft: Radius.circular(12)), // ), // padding: EdgeInsets.only(left: 10.w, right: 16.w), // child: Row( // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Padding( // padding: const EdgeInsets.only(top: 14).h, // child: Stack( // children: [ // SizedBox( // width: 35.w, // height: 40.w, // child: Assets.images.iconFilesFile.image()), // Visibility( // visible: item.isExample.isTrue, // child: Container( // margin: const EdgeInsets.only(top: 32).w, // decoration: BoxDecoration( // color: "#B2BAC4".toColor(), // borderRadius: BorderRadius.circular(4)), // padding: const EdgeInsets.symmetric( // horizontal: 5.5, vertical: 2) // .w, // child: Text(StringName.homeTalkExample.tr, // style: TextStyle( // height: 1, // fontSize: 12.sp, // color: ColorName.white)), // ), // ), // ], // ), // ), // SizedBox(width: 8.w), // Expanded( // child: Column( // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.start, // children: [ // Text(item.title.value.orEmpty, // maxLines: 1, // overflow: TextOverflow.ellipsis, // style: TextStyle( // fontSize: 15.sp, // color: ColorName.primaryTextColor, // fontWeight: FontWeight.bold)), // SizedBox(height: 5.h), // Text( // item.summary.value.orEmpty, // style: TextStyle( // fontSize: 12.sp, color: ColorName.secondaryTextColor), // overflow: TextOverflow.ellipsis, // maxLines: 2, // ), // SizedBox(height: 8.h), // Row( // crossAxisAlignment: CrossAxisAlignment.center, // children: [ // Text(item.duration.toFormattedDuration(), // style: TextStyle( // fontSize: 12.sp, // color: ColorName.tertiaryTextColor)), // SizedBox(width: 6.w), // Container( // width: 1, // height: 9, // color: ColorName.tertiaryTextColor), // SizedBox(width: 6.w), // Text(item.createTime.orEmpty, // style: TextStyle( // fontSize: 12.sp, // color: ColorName.tertiaryTextColor)) // ], // ) // ], // ), // ) // ], // )), // ); // } // Widget buildTitle(String titleName, VoidCallback? onTap) { // return Padding( // padding: const EdgeInsets.symmetric(horizontal: 12).w, // child: Row( // crossAxisAlignment: CrossAxisAlignment.center, // children: [ // Text(titleName, // style: TextStyle( // fontWeight: FontWeight.bold, // fontSize: 17.sp, // color: ColorName.primaryTextColor)), // const Spacer(), // Visibility( // visible: onTap == null ? false : true, // child: GestureDetector( // onTap: onTap, // child: Padding( // padding: const EdgeInsets.symmetric(vertical: 6).w, // child: Row( // crossAxisAlignment: CrossAxisAlignment.center, // children: [ // Text( // StringName.homeTalkSeeAll.tr, // style: TextStyle( // fontSize: 13.sp, color: ColorName.tertiaryTextColor), // ), // Container( // margin: const EdgeInsets.only(bottom: 1), // width: 16.w, // height: 16.w, // child: Assets.images.iconHomeTalkArrow.image()), // ], // ), // ), // ), // ) // ], // ), // ); // } } // Widget buildAgendaEmptyView(double top, {bool isVisible = true}) { // return Visibility( // visible: isVisible, // child: Container( // width: double.infinity, // padding: EdgeInsets.symmetric(vertical: top), // child: Column( // children: [ // SizedBox( // width: 100.w, // height: 100.w, // child: Assets.images.iconNoTask.image()), // SizedBox(height: 4.h), // Text(StringName.agendaNoData.tr, // style: TextStyle( // color: ColorName.secondaryTextColor, fontSize: 14.sp)), // ], // ), // ), // ); // } Widget getHomeHeadView( {GlobalKey? key, VoidCallback? recordClick, VoidCallback? pickerAudioFileClick}) { return Row( key: key, children: [ Expanded( child: _buildHeaderCard( StringName.homeTalkAudio.tr, StringName.homeTalkQuickAudio.tr, Assets.images.iconHomeTalkRecordCard.image().image, [ "#1763F9".toColor(), "#28B2FF".toColor(), ], onTap: () { recordClick?.call(); }), ), SizedBox(width: 8.w), Expanded( child: _buildHeaderCard( StringName.homeTalkImportAudio.tr, StringName.homeTalkAnalyzeLocalAudio.tr, Assets.images.iconHomeTalkSelectCard.image().image, [ "#5869ED".toColor(), "#6E8AF7".toColor(), ], onTap: () { pickerAudioFileClick?.call(); }), ), ], ); } Widget _buildHeaderCard( String title, String content, ImageProvider imageProvider, List bgColor, { VoidCallback? onTap, }) { return GestureDetector( onTap: onTap, child: AspectRatio( aspectRatio: 164 / 80, child: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: bgColor, ), borderRadius: BorderRadius.circular(12), ), child: Stack( children: [ Align( alignment: Alignment.centerRight, child: AspectRatio( aspectRatio: 1, child: SizedBox( height: double.infinity, child: Image(image: imageProvider)), ), ), Align( alignment: Alignment.centerLeft, child: IntrinsicHeight( child: Container( margin: EdgeInsets.only(left: 12.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title, style: TextStyle( fontSize: 16.sp, color: ColorName.white, fontWeight: FontWeight.bold)), SizedBox(height: 4.h), Text(content, style: TextStyle( fontSize: 12.sp, color: ColorName.white80)), ], ), ), ), ) ], ), ), ), ); } class CommonSliverHeaderDelegate extends SliverPersistentHeaderDelegate { PreferredSize child; //传入preferredsize组件,因为此组件需要固定高度 Color? backgroundColor; //需要设置的背景色 CommonSliverHeaderDelegate({required this.child, this.backgroundColor}); @override Widget build( BuildContext context, double shrinkOffset, bool overlapsContent) { return Container( color: backgroundColor, child: child, ); } @override double get maxExtent => child.preferredSize.height; @override double get minExtent => child.preferredSize.height; @override bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) { return true; } }