import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_cupertino_date_picker/flutter_cupertino_date_picker.dart'; import 'package:flutter_picker/flutter_picker.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:liftmanager/internal/bbs/bbs_router.dart'; import 'package:liftmanager/internal/bbs/model/banner_model.dart' as banner; import 'package:liftmanager/internal/bbs/model/mix_model.dart'; import 'package:liftmanager/internal/bbs/model/search_model.dart'; import 'package:liftmanager/internal/means/page/means_pdf.dart'; import 'package:liftmanager/internal/news/model/news_comm_entity.dart'; import 'package:liftmanager/internal/news/news_router.dart'; import 'package:liftmanager/internal/work/work_router.dart'; import 'package:liftmanager/res/iconfont.dart'; import 'package:liftmanager/res/resources.dart'; import 'package:liftmanager/routers/fluro_navigator.dart'; import 'package:liftmanager/utils/image_utils.dart'; import 'package:liftmanager/utils/theme_utils.dart'; import 'package:liftmanager/utils/time_format.dart'; import 'package:liftmanager/utils/utils.dart'; import 'package:liftmanager/widgets/load_image.dart'; import 'package:path_provider/path_provider.dart'; class SwipeWidget extends StatelessWidget { const SwipeWidget({Key key, this.banners}) : super(key: key); final List banners; // List bannersLL = [ // 'tab_first/banner', // 'tab_first/banner', // 'tab_first/banner', // ]; Future createFileOfPdfUrl(url) async { final filename = url.substring(url.lastIndexOf("/") + 1); var request = await HttpClient().getUrl(Uri.parse(url)); var response = await request.close(); var bytes = await consolidateHttpClientResponseBytes(response); String dir = (await getApplicationDocumentsDirectory()).path; File file = new File('$dir/$filename'); await file.writeAsBytes(bytes); return file; } @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; double height = 180; return Container( width: width, height: height, child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(10)), child: Swiper( index: 0, itemBuilder: (BuildContext context, index) { return GestureDetector( onTap: () { if (banners[index].jumpType == 2) { print('${banners[index].jumpType}'); NavigatorUtils.push( context, "${WorkRouter.webview}?title=" + Uri.encodeComponent("详情") + "&url=" + Uri.encodeComponent(banners[index].url)); } else if (banners[index].jumpType == 1) { print('777'); createFileOfPdfUrl(banners[index].url).then((f) { // setState(() { // pathPDF = f.path; Navigator.push( context, MaterialPageRoute( builder: (context) => PDFScreen(f.path, "null", "null"))); // }); }); } }, child: Container( width: width, height: height, key: UniqueKey(), // margin:EdgeInsets.only(left:15,right:15), child: LoadNetworkImage( banners[index].image, width: width, height: height, fit: BoxFit.fill, ), ), ); }, pagination: SwiperPagination( builder: RectSwiperPaginationBuilder( color: Colors.grey, activeColor: Colors.white, size: Size(12, 10), activeSize: Size(16, 10), ), ), itemCount: banners.length, scrollDirection: Axis.horizontal, autoplay: true, onTap: (index) { // print(index); }, ), )); } } class Diagnosis extends StatelessWidget { Diagnosis({Key key, this.fun}) : super(key: key); List diagnosisObj = [ { "title": "快速问诊", "img": "tab_first/Diagnosis_first", "desc": "搜电梯品牌 找专家咨询", }, { "title": "出诊", "img": "tab_first/Diagnosis_second", "desc": "在线预约 上门服务", }, ]; Function fun; List listWidget(context) => diagnosisObj.asMap().keys.map((i) { return GestureDetector( child: Container( color: ThemeUtils.getTabsBg(context), padding: EdgeInsets.only( left: 15, right: 15, // top: ScreenUtil().setHeight(15), bottom: 20), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ LoadAssetImage( // image: AssetImage(i['img']), diagnosisObj[i]["img"], width: 40, height: 40, // alignment: Alignment.centerLeft, ), SizedBox(width: 10), Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( diagnosisObj[i]["title"], style: TextStyle(fontSize: 22), textAlign: TextAlign.start, ), Text( diagnosisObj[i]["desc"], style: TextStyle( color: Color(0xff999999), fontSize: 14), textAlign: TextAlign.start, ), ], ), ), ], ), Container( child: Icon( Icons.keyboard_arrow_right, color: Color(0xffcccccc), ), ) ]), ), onTap: () { if (i == 0 && !Utils.getAuthByRouter(context, 'quick_consultation')) { return false; } if (i == 1 && !Utils.getAuthByRouter(context, 'quich_visit')) { return false; } String index = i.toString(); NavigatorUtils.push(context, "${BbsRouter.brandPage}?index=$index"); }, ); }).toList(); @override Widget build(BuildContext context) { return Card( margin: EdgeInsets.all(ScreenUtil().setWidth(10)), //设置圆角度,也可以不设置有默认值 shape: RoundedRectangleBorder( //形状 //修改圆角 borderRadius: BorderRadius.all(Radius.circular(10)), ), //阴影颜色 // color: Colors.orangeAccent, //阴影高度 elevation: 1.0, child: ClipRRect( borderRadius: BorderRadius.all(Radius.circular(10)), child: Container( padding: EdgeInsets.only(top: 20), child: Column(children: listWidget(context)), ), ), ); } } class QuestionCell extends StatelessWidget { QuestionCell({this.item}); final dynamic item; @override Widget build(BuildContext context) { if (item is Records || item is InfoList) { } else { return Container(); // data = NewsItems(); } return GestureDetector( child: Container( padding: EdgeInsets.only( top: 10, bottom: 10, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "${item.title ?? ''}", textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff333333), ), maxLines: 1, overflow: TextOverflow.ellipsis, ), SizedBox( height: 5, ), Row( children: [ ClipRRect( borderRadius: BorderRadius.circular(15), child: Container( child: LoadNetworkImage( item?.avatarUrl, // fit: BoxFit.fitWidth, width: 31, height: 31, ), )), SizedBox( width: 5, ), Text( item.userName ?? '', style: TextStyle( fontSize: 14, fontWeight: FontWeight.w500, color: Color(0xff565A64), ), ), SizedBox(width: 5), _clipText( title: 'LV1', bgcolor: Color(0xffFD5E62), textcolor: Colors.white), ], ), SizedBox( height: 10, ), Text( item.expression ?? '', textAlign: TextAlign.left, style: TextStyle( color: Color(0xff999999), fontSize: 12, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), Container( padding: EdgeInsets.only( top: ScreenUtil().setHeight(5), bottom: ScreenUtil().setHeight(5)), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: item.imgs != null && item.imgs.isNotEmpty ? List.from( item.imgs.split(",").asMap().keys.map((index) { // print(item); return index < 3 ? Container( padding: index < item.imgs.split(",").length - 1 ? EdgeInsets.only(right: 6) : EdgeInsets.only(right: 0), // color:Colors.red, // decoration: BoxDecoration( // borderRadius: BorderRadius.circular(20.0), // ), child: ClipRRect( borderRadius: BorderRadius.circular(10), child: LoadNetworkImage( item.imgs.split(",")[index], fit: BoxFit.fill, height: ScreenUtil().setWidth(80), width: ScreenUtil().setWidth(110), isWater: true, ), ), ) : Container(child: null); }).toList()) : []), ), Row( children: [ _clipText( title: "${item.brandName ?? ''}", bgcolor: Color.fromRGBO(67, 141, 250, .16), textcolor: Color(0xFF5887FF)), Expanded(child: Container()), Text( "${item.browseNum ?? '0'}浏览·${item.likeNum ?? '0'}赞", textAlign: TextAlign.right, style: TextStyle( color: Color(0xFFCCCCCC), fontSize: 11, ), ) ], ), SizedBox( height: 10, ), ]), ), onTap: () { NavigatorUtils.push( context, "${BbsRouter.questionDetail}?id=${item.id.toString()}"); }, ); } _clipText({title, bgcolor, textcolor}) { return ClipRRect( borderRadius: BorderRadius.all(Radius.circular(3)), child: Container( color: bgcolor, padding: EdgeInsets.all(3), alignment: Alignment.center, child: Text( title, style: TextStyle(fontSize: 11, color: textcolor), ), ), ); } } class HotQuestion extends StatelessWidget { const HotQuestion({Key key, this.initList}) : super(key: key); final List initList; @override Widget build(BuildContext context) { List widgetList = []; for (int i = 0; i < initList.length; i++) { widgetList.add(Column(children: [ QuestionCell(item: initList[i]), if (i != initList.length - 1) Divider(), ])); } return Container( color: Colors.white, padding: EdgeInsets.symmetric(horizontal: 10), child: Column(children: widgetList), ); } } class HotClass { const HotClass({Key key, this.videoList}); final List videoList; List listWidget(context) => videoList.asMap().keys.map((i) { return GestureDetector( child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded( flex: 1, child: AspectRatio( aspectRatio: 177 / 113, child: Stack( alignment: Alignment.center, children: [ Container( // color: Colors.red, child: SizedBox.expand( child: ClipRRect( borderRadius: BorderRadius.circular(10), child: LoadNetworkImage( videoList[i].cover, isWater: true, ), )), ), Image.asset(ImageUtils.getImgPath('play_button')), ], ))), Container( padding: EdgeInsets.only(top: 5, left: 5), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( videoList[i].title ?? "", textAlign: TextAlign.left, style: TextStyle(fontSize: 14, color: Color(0xff565A64)), maxLines: 1, overflow: TextOverflow.ellipsis, ), Text( videoList[i].descr ?? "", textAlign: TextAlign.left, overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( fontSize: 12, color: Color(0xff9a9a9a), ), ), SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( padding: EdgeInsets.all(3), decoration: BoxDecoration( color: Color(0x33448EFA), borderRadius: BorderRadius.circular(4), ), child: Text( videoList[i].brandName != null ? videoList[i].brandName.toString() : "", textAlign: TextAlign.left, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 11, color: Color(0xff5888FF), ), )), Text( "${videoList[i].browseNum ?? '0'}浏览·${videoList[i].likeNum ?? '0'}赞", textAlign: TextAlign.left, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 11, color: Color(0xffCCCCCC), ), ), ], ), ], )) ])), onTap: () { print(i); NavigatorUtils.push(context, "${BbsRouter.videoDetail}?id=${videoList[i].id.toString()}"); }, ); }).toList(); List listVideo(context) => videoList.map((e) { return VideoCell(e); }).toList(); } class VideoCell extends StatelessWidget { dynamic data; VideoCell(this.data); @override Widget build(Object context) { if (data is Records || data is InfoList) { } else { return Container(); // data = NewsItems(); } return GestureDetector( child: Container( height: 116, padding: EdgeInsets.symmetric(vertical: 10), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Colours.line), ), ), child: LayoutBuilder( builder: (context, constraints) => Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( // padding: EdgeInsets.only(top: 5, left: 5), width: constraints.maxWidth - 167, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( data.title ?? "", textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff565A64)), maxLines: 1, overflow: TextOverflow.ellipsis, ), Expanded( child: Text( data.descr ?? "", textAlign: TextAlign.left, overflow: TextOverflow.ellipsis, maxLines: 1, style: TextStyle( fontSize: 12, color: Color(0xff9a9a9a), ), )), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( padding: EdgeInsets.all(3), decoration: BoxDecoration( color: Color(0x33448EFA), ), child: Text( data.brandName != null ? data.brandName.toString() : "", textAlign: TextAlign.left, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 11, color: Color(0xff5888FF), ), )), Text( "${data.browseNum ?? '0'}浏览·${data.likeNum ?? '0'}赞", textAlign: TextAlign.left, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 11, color: Color(0xffCCCCCC), ), ), ], ), ], )), Stack( alignment: Alignment.center, children: [ SizedBox( width: 147, height: 96, child: ClipRRect( borderRadius: BorderRadius.circular(10), child: LoadNetworkImage( data.cover, isWater: true, ), )), Image.asset(ImageUtils.getImgPath('play_button')), ], ), ]))), onTap: () { NavigatorUtils.push( context, "${BbsRouter.videoDetail}?id=${data.id.toString()}"); }, ); } } class HotProduct extends StatelessWidget { HotProduct({Key key, this.productList}) : super(key: key); final List productList; List listWidget(context) => productList.map((i) { return ProductCell(i); }).toList(); @override Widget build(BuildContext context) { return Container( color: Colors.white, child: Column(children: listWidget(context)), ); } } class ProductCell extends StatelessWidget { final dynamic data; ProductCell(this.data); @override Widget build(Object context) { if (data is Records || data is InfoList) { } else { return Container(); // data = NewsItems(); } return InkWell( child: Container( height: 110, padding: EdgeInsets.only(left: 0, right: 0, top: 10, bottom: 10), decoration: BoxDecoration( border: Border( bottom: BorderSide(color: Color(0xffF9F9F9)), ), ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ ClipRRect( borderRadius: BorderRadius.circular(10), child: LoadNetworkImage( (data?.imgs ?? '').split(",")[0], width: ScreenUtil().setWidth(90), height: ScreenUtil().setWidth(90), isWater: true, ), ), SizedBox( width: 10, ), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Text( data.name ?? "", textAlign: TextAlign.left, // overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 14, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ), if (data.discountPrice != null) Text( '¥${data.discountPrice.toInt()}', style: TextStyle( color: Color(0xffFF5C00), fontSize: 16, ), ), if (data.discountPrice == null) Text( '¥${data.price?.toInt() ?? '暂无'}', style: TextStyle( color: Color(0xffFF5C00), fontSize: 16, ), ), if (data.discountPrice != null) Text( '¥${data.price.toInt()}', style: TextStyle( color: Color(0xff999999), fontSize: 11, decoration: TextDecoration.lineThrough, ), ), ], )), if (data.brandName != null) Container( padding: EdgeInsets.all(3), decoration: BoxDecoration( borderRadius: BorderRadius.circular(3), color: Color(0x33448EFA), ), child: Text( data.brandName, textAlign: TextAlign.left, style: TextStyle( fontSize: 11, color: Color(0xff5887FF), ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ), Spacer(), Container( child: Row( children: [ Icon(Iconfont.shangjia, size: 15, color: Colors.orange), SizedBox(width: 5), Text( "${data.manufacturer}", textAlign: TextAlign.left, style: TextStyle( fontSize: 11, color: Color(0xff666666), ), maxLines: 1, overflow: TextOverflow.ellipsis, ), ], ), ), ], ), ), ], ), ), onTap: () { NavigatorUtils.push( context, "${BbsRouter.productDetail}?id=${data.id.toString()}"); }, ); } } class HotNews extends StatelessWidget { HotNews({Key key, this.newsList}) : super(key: key); final List newsList; @override Widget build(BuildContext context) { return Container( color: Colors.white, child: Column( children: newsList.map((i) { return NewsCell(i); }).toList()), ); } } class NewsCell extends StatelessWidget { final dynamic data; NewsCell(this.data); @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; if (data is NewsItems || data is InfoList) { } else { return Container(); // data = NewsItems(); } return InkWell( onTap: () { NavigatorUtils.push(context, "${NewsRouter.newsDetail}?id=${data.id}"); }, child: Container( width: width, padding: EdgeInsets.symmetric(vertical: 10), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 1, color: Colours.line), ), color: ThemeUtils.getTabsBg(context)), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( data.title, style: TextStyle(fontSize: 15), // overflow: TextOverflow.ellipsis, ), Gaps.vGap12, Text( "${data?.releaseUser ?? ''}·阅读${data?.lookNum ?? 0}次·点赞${data?.likeNum ?? 0}", style: TextStyle(fontSize: 11, color: Colours.text_gray), ), ], ), ), ); } } class HotPosition extends StatelessWidget { HotPosition({Key key, this.positionList}) : super(key: key); final List positionList; List listWidget(context) => positionList.map((i) { return PositionCell(i); }).toList(); @override Widget build(BuildContext context) { return Container( color: Colors.white, child: Column(children: listWidget(context)), ); } } class PositionCell extends StatelessWidget { final dynamic data; PositionCell(this.data); @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; if (data is Records || data is InfoList) { } else { return Container(); // data = NewsItems(); } return InkWell( child: Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: width, padding: EdgeInsets.only(bottom: ScreenUtil().setHeight(5)), child: Row( children: [ if (data.hotFlag == 1) ...[ Container( padding: EdgeInsets.all(2), decoration: BoxDecoration( color: Color(0xffFBC247), borderRadius: BorderRadius.only( topLeft: Radius.circular(5), bottomRight: Radius.circular(5), ), ), child: Text( '热招', style: TextStyle( color: Colors.white, fontSize: 11, ), ), ), SizedBox( width: 5, ), ], Container( child: Text( data.job ?? "", style: TextStyle( fontSize: 14, color: Color(0xff565A64), fontWeight: FontWeight.w600, ), overflow: TextOverflow.ellipsis, ), ), Spacer(), Container( width: width * 0.4, child: Text( '${data.lowerSalary?.toInt()}-${data.upperSalary?.toInt()}/月', textAlign: TextAlign.right, style: TextStyle( fontSize: 14, color: Color(0xffFF5C00), ), overflow: TextOverflow.ellipsis, ), ) ], ), ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "${data.provinceName ?? ''}${data.cityName ?? ''}", textAlign: TextAlign.right, style: TextStyle( fontSize: 13, color: Color(0xff9A9A9A), ), overflow: TextOverflow.ellipsis, ), Text( DateUtils.instance.getFormartData( timeSamp: data.createTime, format: "yyyy-MM-dd"), textAlign: TextAlign.left, style: TextStyle( fontSize: 12, color: Color(0xff9A9A9A), ), ), ], ), Text( data.company?.name ?? "", textAlign: TextAlign.left, style: TextStyle( fontSize: 14, color: Color(0xff666666), ), overflow: TextOverflow.ellipsis, ), SizedBox( height: 10, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Text( '${data.company?.corporator ?? ""} ${data.company?.telephone ?? ""}', textAlign: TextAlign.left, style: TextStyle( fontSize: 13, color: Color(0xff565A64), ), overflow: TextOverflow.ellipsis, ), Spacer(), Container( alignment: Alignment.center, padding: EdgeInsets.symmetric(horizontal: 15), height: 25, decoration: BoxDecoration( color: Color.fromRGBO(67, 141, 250, .16), borderRadius: BorderRadius.circular(12), ), child: Text( '申请', style: TextStyle(color: Color(0xff5888FF), fontSize: 13), ), ), ], ), SizedBox( height: 10, ), Divider(thickness: 0.5, height: 0.5), SizedBox( height: 10, ), ]), ), onTap: () { NavigatorUtils.push( context, "${BbsRouter.positionDetail}?id=${data.id}"); }, ); } } class LabelTitle extends StatelessWidget { LabelTitle( {Key key, this.title, this.userTap, this.isMore = true, this.hasArrow = false, this.titleStyle}) : super(key: key); final String title; final Function userTap; final bool isMore; final bool hasArrow; TextStyle titleStyle; @override Widget build(BuildContext context) { return GestureDetector( onTap: () { userTap(); }, child: Container( height: ScreenUtil().setHeight(45), padding: EdgeInsets.symmetric(horizontal: 10), alignment: Alignment.centerLeft, decoration: BoxDecoration( color: ThemeUtils.getTabsBg(context), border: Border( bottom: BorderSide( width: 0.5, color: ThemeUtils.getDialogTextFieldColor(context)), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( decoration: BoxDecoration( border: Border( // left: BorderSide(width: 3, color: Colours.app_main), )), child: Text( title, style: titleStyle, ), ), ], ), Container( child: Row(children: [ Text( isMore == true ? "更多" : '', style: TextStyle( fontSize: ScreenUtil().setSp(12), color: Color(0xFF666666)), ), hasArrow ? Container( child: Images.arrowRight, ) : Container(child: null) ])) ], ), ), ); } } class CommonSectionHeader extends StatelessWidget { final String title; final double fontSize; bool isMust; CommonSectionHeader( {this.title = '', this.fontSize = 15, this.isMust = false}); @override Widget build(BuildContext context) { return Container( child: Row( children: [ Container( width: 2, height: 15, decoration: BoxDecoration( border: Border(left: BorderSide(width: 2, color: Colors.blue)), ), ), SizedBox( width: 10, ), Text( title, style: TextStyle( fontSize: fontSize, color: Color(0xff333333), ), ), isMust ? Text( '*', style: TextStyle( fontSize: fontSize, color: Colors.red, ), ) : Container(), ], )); } } class SectionHeader extends StatelessWidget { final String title; final Function onTap; final bool showMore; SectionHeader({this.title, this.onTap, this.showMore = false}); @override Widget build(BuildContext context) { return GestureDetector( onTap: () { if (onTap != null) { onTap(); } }, child: Container( height: 40, child: Row( children: [ Container( height: 13, width: 0, decoration: BoxDecoration( border: Border( left: BorderSide( width: 2, color: Color(0xff568AFF), ), ), ), ), SizedBox( width: 10, ), Expanded( child: Text( title, style: TextStyle(color: Color(0xff343434), fontSize: 15), ), ), if (showMore) Text( '更多', style: TextStyle(color: Color(0xff999999), fontSize: 12), ), SizedBox( width: 10, ), ], ))); } } class FilterHeader extends StatelessWidget { final List filterNameList; final Function(int index) onTap; final int activeIndex; FilterHeader({ @required this.filterNameList, this.onTap, this.activeIndex = 0, }); @override Widget build(BuildContext context) { var widgetList = [ GestureDetector( child: Container( padding: EdgeInsets.symmetric( vertical: 13, // horizontal: 10, ), decoration: BoxDecoration( border: activeIndex == 0 ? Border( bottom: BorderSide( width: 2, color: Color(0xff568AFF), ), ) : null, ), child: Text( '全部', style: TextStyle( color: Color(0xff343434), fontSize: 14, ), ), ), onTap: () { if (onTap != null) onTap(0); }, ), ]; if (filterNameList != null) { widgetList.addAll( filterNameList.map( (e) => GestureDetector( child: Container( padding: EdgeInsets.symmetric( vertical: 13, // horizontal: 10, ), decoration: BoxDecoration( border: activeIndex == (filterNameList.indexOf(e) + 1) ? Border( bottom: BorderSide( width: 2, color: Color(0xff568AFF), ), ) : null, ), child: Text( e, style: TextStyle( color: Color(0xff343434), fontSize: 14, ), ), ), onTap: () { var index = filterNameList.indexOf(e) + 1; if (onTap != null) onTap(index); }, ), ), ); } return Container( height: 45, child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: widgetList, ), ); } } class CustomFilterHeader extends StatelessWidget { final List filterNameList; final Function(int index) onTap; final int activeIndex; CustomFilterHeader({ @required this.filterNameList, this.onTap, this.activeIndex, }); @override Widget build(BuildContext context) { var widgetList = [ LayoutId( id: 0, child: GestureDetector( child: Container( padding: EdgeInsets.symmetric( vertical: 13, // horizontal: 10, ), decoration: BoxDecoration( border: activeIndex == 0 ? Border( bottom: BorderSide( width: 2, color: Color(0xff568AFF), ), ) : null, ), child: Text( '全部', style: TextStyle( color: Color(0xff343434), fontSize: 14, ), ), ), onTap: () { if (onTap != null) onTap(0); }, ), ), ]; if (filterNameList != null) { int loopCount = 0; for (var name in filterNameList) { var layoutId = ++loopCount; widgetList.add( LayoutId( id: layoutId, child: GestureDetector( child: Container( padding: EdgeInsets.symmetric( vertical: 13, // horizontal: 10, ), decoration: BoxDecoration( border: activeIndex == layoutId ? Border( bottom: BorderSide( width: 2, color: Color(0xff568AFF), ), ) : null, ), child: Text( name, style: TextStyle( color: Color(0xff343434), fontSize: 14, ), ), ), onTap: () { if (onTap != null) onTap(layoutId); }, ), ), ); } } return Container( height: 45, child: CustomMultiChildLayout( children: widgetList, delegate: CustomFilterHeaderLayoutDelegate( widgetList.map((e) => e.id).toList(), ), ), ); } } class CustomFilterHeaderLayoutDelegate extends MultiChildLayoutDelegate { List childIds; CustomFilterHeaderLayoutDelegate(this.childIds); @override void performLayout(Size size) { Size leaderSize = Size.zero; if (hasChild(0)) { leaderSize = layoutChild(0, BoxConstraints.loose(size)); positionChild(0, Offset.zero); } var subIds = childIds.sublist(1); const spacing = 20; const threshold = 0; var offset = Offset.zero; for (var id in subIds) { if (hasChild(id)) { offset = Offset(offset.dx + leaderSize.width + spacing, 0); leaderSize = layoutChild( id, BoxConstraints.loose(size), ); if (size.width - offset.dx - leaderSize.width > threshold) { positionChild(id, offset); } else { positionChild(id, Offset.infinite); } } } } @override bool shouldRelayout(covariant MultiChildLayoutDelegate oldDelegate) { return false; } } class ChioseThis extends StatelessWidget { ChioseThis( {Key key, this.list, this.value, this.label, this.isMust: false, this.fun, this.labelText = '请选择'}) : super(key: key); List list; String value; String label; bool isMust; Function fun; String labelText; @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; return InkWell( onTap: () { showModalBottomSheet( context: context, builder: (context) { return Container( height: 80, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: list.asMap().keys.map((index) { return InkWell( onTap: () { fun(index); }, child: Container( width: width, padding: EdgeInsets.only( bottom: ScreenUtil().setWidth(10), top: ScreenUtil().setWidth(5)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Colours.line), ), ), child: Text( list[index], style: TextStyle( color: Color(0xff333333), fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.center, ), ), ); }).toList(), ), ); }); }, child: Container( padding: EdgeInsets.only( top: ScreenUtil().setWidth(15), bottom: ScreenUtil().setWidth(15)), margin: EdgeInsets.only(left: ScreenUtil().setWidth(15)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Colours.line), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( label, style: TextStyle( color: Color(0xff222222), // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Offstage( offstage: !this.isMust, child: Text( " *", style: TextStyle(color: Colors.red), ), ), Expanded(flex: 1, child: Container()), value.isEmpty ? Container( child: Row(children: [ Text( labelText, style: TextStyle( color: Color(0xffcccccc), // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only(top: 3), child: Icon( Icons.keyboard_arrow_right, size: 20.0, color: Color(0xffcccccc), ), ), SizedBox(width: 10) ]), ) : Container( padding: EdgeInsets.only(right: ScreenUtil().setWidth(15)), child: Row(children: [ Text( value, style: TextStyle( color: Color(0xff222222), fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ]), ), ]), ), ); } } class DatePickerInputField extends StatelessWidget { DatePickerInputField( {Key key, this.value = '', this.label, this.isMust: false, this.onSelectionConfirmed, this.labelText = '请选择'}) : super(key: key); final String value; final String label; final bool isMust; final Function(String birthday) onSelectionConfirmed; final String labelText; @override Widget build(BuildContext context) { return InkWell( onTap: () { DatePicker.showDatePicker(context, // pickerMode: DateTimePickerMode.date, dateFormat: 'yyyy-MM', locale: DateTimePickerLocale.zh_cn, // initialDateTime: DateTime.now(), maxDateTime: DateTime.now(), // onChange: (datetime, _){ // // }, onConfirm: (datetime, _) { this.onSelectionConfirmed(DateUtils() .getFormattedDateTimeStr(datetime: datetime, format: 'yyyy-MM')); }); }, child: Container( padding: EdgeInsets.only( top: ScreenUtil().setWidth(15), bottom: ScreenUtil().setWidth(15)), margin: EdgeInsets.only(left: ScreenUtil().setWidth(15)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Colours.line), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( label, style: TextStyle( color: Color(0xff222222), // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Offstage( offstage: !this.isMust, child: Text( "*", style: TextStyle(color: Colors.red), ), ), Expanded(flex: 1, child: Container()), value.isEmpty ? Container( child: Row(children: [ Text( labelText, style: TextStyle( color: Color(0xffcccccc), // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only(top: 3), child: Icon( Icons.keyboard_arrow_right, size: 20.0, color: Color(0xffcccccc), ), ), SizedBox(width: 10) ]), ) : Container( padding: EdgeInsets.only(right: ScreenUtil().setWidth(15)), child: Row(children: [ Text( value, style: TextStyle( color: Color(0xff222222), fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ]), ), ]), ), ); } } class IsvideoList extends StatelessWidget { IsvideoList({Key key, this.list, this.fun}) : super(key: key); List list; Function fun; List listWidget(context) => list.asMap().keys.map((i) { double width = MediaQuery.of(context).size.width; return GestureDetector( onTap: () { fun(); }, child: Container( padding: EdgeInsets.only(left: 10, right: 10, bottom: 5), width: width / 2, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( child: Stack( children: [ ClipRRect( borderRadius: BorderRadius.circular(5), child: Container( child: LoadAssetImage( list[i]["image"], width: 190, height: 140, ), ), ), Positioned( left: 77, top: 57, child: Icon( IconData(0xe607, fontFamily: "Iconfont"), size: 26.0, color: Colors.white, ), ) ], )), Text( list[i]["title"], style: TextStyle( color: Color(0xff222222), fontSize: ScreenUtil().setSp(16)), textAlign: TextAlign.start, ), Text( list[i]["brand"], style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), Text( "${list[i]["num"]}人点赞", style: TextStyle( color: Color(0xff999999), fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ])), ); }).toList(); @override Widget build(BuildContext context) { return Container( color: Colors.white, child: Wrap( // children:null children: listWidget(context)), ); } } class Heng extends StatelessWidget { Heng({Key key, this.left, this.right, this.leftColor, this.rightColor}) : super(key: key); String left; String right; int leftColor; int rightColor; @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.only( left: ScreenUtil().setWidth(15), right: ScreenUtil().setWidth(15), top: ScreenUtil().setWidth(10), bottom: ScreenUtil().setWidth(10)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: .5, color: Color(0xfff5f5f5)), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( left, style: TextStyle(color: Color(leftColor), fontSize: 14), textAlign: TextAlign.start, ), Text( right, style: TextStyle(color: Color(rightColor), fontSize: 14), textAlign: TextAlign.start, ), ]), ); } } // 选择下拉 class ChiosePicker extends StatefulWidget { ChiosePicker({ Key key, this.range, this.value, this.label, this.isMust: false, this.onConfirm, this.placeholder = '请选择', }) : super(key: key); final List range; String value; final String label; final bool isMust; final String placeholder; final Function(String, int) onConfirm; @override _ChiosePickerState createState() => _ChiosePickerState(); } class _ChiosePickerState extends State { // String _value; showPickerModal(BuildContext context) { new Picker( cancelText: "取消", confirmText: "确认", adapter: PickerDataAdapter( pickerdata: widget.range, ), changeToFirst: true, hideHeader: false, onConfirm: (Picker picker, List value) { widget.value = picker.getSelectedValues()[0]; widget.onConfirm(picker.getSelectedValues()[0], value[0]); setState(() {}); }, ).showModal(this.context); } @override Widget build(BuildContext context) { // _value = widget.value; return InkWell( onTap: () { FocusScope.of(context).requestFocus(FocusNode()); showPickerModal(context); }, child: Container( padding: EdgeInsets.only( top: ScreenUtil().setWidth(15), bottom: ScreenUtil().setWidth(15), ), margin: EdgeInsets.only(left: ScreenUtil().setWidth(15)), decoration: BoxDecoration( border: Border( bottom: BorderSide(width: 0.5, color: Colours.line), ), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( widget.label, style: TextStyle( // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Offstage( offstage: !widget.isMust, child: Text( " *", style: TextStyle(color: Colors.red), ), ), Expanded(flex: 1, child: Container()), widget.value == null || widget.value.isEmpty ? Container( child: Row( children: [ Text( widget.placeholder, style: TextStyle( color: Color(0xffcccccc), // fontSize: ScreenUtil().setSp(14) ), textAlign: TextAlign.start, ), Container( padding: EdgeInsets.only(top: 3), child: Icon( Icons.keyboard_arrow_right, size: 20.0, color: Color(0xffcccccc), ), ), SizedBox(width: 10) ], ), ) : Container( padding: EdgeInsets.only(right: ScreenUtil().setWidth(15)), child: Row( children: [ Text( widget.value, style: TextStyle( color: Color(0xff222222), fontSize: ScreenUtil().setSp(14)), textAlign: TextAlign.start, ), ], ), ), ], ), ), ); } } class CommonActionBar extends StatelessWidget { final isFavorited; final Function onTapSharing; final Function onTapFavoriting; final Function onTapAction; final String actionText; final Widget actionWidget; CommonActionBar( {this.isFavorited = false, this.actionText = '', this.onTapSharing, this.onTapFavoriting, this.onTapAction, this.actionWidget}); @override Widget build(BuildContext context) { double width = MediaQuery.of(context).size.width; return Container( width: width, color: Colors.white, padding: EdgeInsets.all(10), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ Expanded( child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ GestureDetector( onTap: () { if (this.onTapSharing != null) this.onTapSharing(); }, child: Container( // padding: EdgeInsets.only(left:25,right:30), child: Column(children: [ Icon( const IconData(0xe693, fontFamily: "Iconfont"), size: 20.0, color: Color(0xff333333), ), Text( "分享", style: TextStyle( color: Color(0xff555A64), fontSize: 12, ), textAlign: TextAlign.start, ), ])), ), GestureDetector( onTap: () { if (this.onTapFavoriting != null) this.onTapFavoriting(); }, child: Container( child: Column(children: [ Icon( isFavorited ? Iconfont.shoucang1 : Iconfont.shoucang, size: 20.0, color: Color(isFavorited ? 0xff5589FF : 0xff555A64), ), Text( isFavorited ? "已收藏" : "收藏", style: TextStyle( color: Color(isFavorited ? 0xff5589FF : 0xff555A64), fontSize: 12, ), textAlign: TextAlign.start, ), ])), ), ], ), ), Container( height: 45, width: 240, decoration: BoxDecoration( color: Color(0xff5589FF), borderRadius: BorderRadius.circular(30), ), child: FlatButton( // padding: EdgeInsets.all(15.0), child: actionWidget != null ? actionWidget : Text( actionText, style: TextStyle( fontSize: 16, ), ), textColor: Colors.white, onPressed: () { if (onTapAction != null) onTapAction(); }, ), ), ], ), ); } } class AlphabeticIndexBar extends StatelessWidget { final Map positionAnchors; final ScrollController controller; const AlphabeticIndexBar({Key key, this.positionAnchors, this.controller}) : super(key: key); @override Widget build(BuildContext context) { var alphabetAnchors = positionAnchors.keys .map( (e) => GestureDetector( child: Text( e, style: TextStyle(color: Color(0xff5589FF), fontSize: 15), ), onTap: () => controller.animateTo(positionAnchors[e], duration: Duration(milliseconds: 500), curve: Curves.decelerate), ), ) .toList(); return Column( // mainAxisAlignment: MainAxisAlignment.spaceBetween, // crossAxisAlignment: CrossA, children: [ ...alphabetAnchors, Text( '#', style: TextStyle(color: Color(0xff5589FF), fontSize: 15), ) ], ); } @override void debugFillProperties(DiagnosticPropertiesBuilder properties) { super.debugFillProperties(properties); properties .add(DiagnosticsProperty('controller', controller)); } } class CircularLoading extends StatelessWidget { @override Widget build(BuildContext context) { return Container( padding: EdgeInsets.only(top: 10, bottom: 10), color: ThemeUtils.getTabsBg(context), child: Center( child: SpinKitFadingCircle( color: Colors.blueAccent, size: 30.0, ), ), ); } }