import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:job_app/config/palette.dart'; import 'package:job_app/models/APiResponse.dart'; import 'package:job_app/models/employmentoffer.dart'; import 'package:job_app/services/employmentOffersService.dart'; import 'package:job_app/widgets/ads_container.dart'; import 'package:job_app/widgets/employment_offer_card.dart'; import 'package:job_app/widgets/filtering%20widgets/mainbottomsheetmodal.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'company_details.dart'; class Jobs extends StatefulWidget { Jobs({Key key}) : super(key: key); @override _JobsState createState() => _JobsState(); } class _JobsState extends State { int pageNumber = 0; int totalItems; int totalPages; List employmentOffers=[]; // for filtering List _foundOffers=[]; // stays the same String searchText=''; RefreshController _refreshController = RefreshController(initialRefresh: false); EmploymentOffersService _employmentOffersService=EmploymentOffersService(); Future getAllOffers() async { ApiResponseModel response = await _employmentOffersService.getAllOffers(size: 1,page: pageNumber); setState(() { employmentOffers=response.data.offers; totalItems=response.data.totalItems; totalPages=response.data.totalPages; _foundOffers=employmentOffers; }); } void _onRefresh() async{ // monitor network fetch await Future.delayed(Duration(milliseconds: 1000)); // if failed,use refreshFailed() _refreshController.refreshCompleted(); } void _onLoading() async{ pageNumber=pageNumber+1; ApiResponseModel response = await _employmentOffersService.getAllOffers(size: 1,page: pageNumber); if(mounted) setState(() { _foundOffers=_foundOffers+response.data.offers; employmentOffers=employmentOffers+response.data.offers; }); if(searchText.isNotEmpty){ employmentOffers=employmentOffers.where((element) => element.schedule.toLowerCase().contains(searchText)).toList(); } _refreshController.loadComplete(); } @override void initState() { // TODO: implement initState super.initState(); getAllOffers(); } @override Widget build(BuildContext context) { return GestureDetector( onTap: () { FocusScope.of(context).requestFocus(new FocusNode()); }, child: Scaffold( backgroundColor: Color.fromRGBO(240, 245, 249, 1), body: Container( margin: EdgeInsets.only(top: 30), child: Column( children: [ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "Jobs", style: TextStyle( fontFamily: 'MontserratSemiBold', fontSize: 22, fontWeight: FontWeight.bold, color: Colors.black), ), ], ), SizedBox( height: 40, ), Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Container( height: 37, width: 260, child: searchOffers(context), ), SizedBox( width: 5, ), Container( height: 55, width: 55, child: IconButton( icon: SvgPicture.asset( "assets/icons/filterIcon.svg", ), onPressed: () { showModalBottomSheet( isScrollControlled: false, shape: RoundedRectangleBorder( borderRadius: BorderRadius.only( topLeft: Radius.circular(50), topRight: Radius.circular(50))), backgroundColor: Palette.secendary, context: context, builder: (context) => BottomSheetBuilder()) .then((value) { setState(() {}); }); }), ), ], ), Expanded( child: Padding( padding: const EdgeInsets.only(top: 18.0), child: Padding( padding: const EdgeInsets.symmetric(horizontal: 18.0), child: SmartRefresher( controller: _refreshController, enablePullDown: false, enablePullUp: true, onRefresh: _onRefresh, onLoading: _onLoading, footer: CustomFooter( builder: (BuildContext context,LoadStatus mode){ Widget body ; if(mode==LoadStatus.loading){ body = CupertinoActivityIndicator.partiallyRevealed(); } return Container( height: 50.0, child: Center(child:body), ); }, ), child: ListView.separated( physics: BouncingScrollPhysics(), itemBuilder: (context, i) => GestureDetector( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => CompanyDetails( offerIndex: i, passedOffer: employmentOffers[i], ))); }, child: EmploymentOfferCard(offerIndex: i,passedOffers: employmentOffers,)), separatorBuilder: (context, i) { return Container( child: (i != 0 && i % 4 == 0) ? AdsContainer(i) : null, ); }, itemCount: employmentOffers.length), ), ), ), ), ], ), ), ), ); } searchOffers ( context) { return TextField( autocorrect: false, onChanged: (string){ setState(() { searchText=string; }); _foundSearch(searchText); }, style: TextStyle(fontSize: 17, height: 1, color: Colors.black), cursorColor: Palette.primary, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( hintStyle: TextStyle( decoration: TextDecoration.none, color: Color.fromRGBO(112, 112, 112, 0.5)), prefixIcon: Icon( Icons.search, color: Color.fromRGBO(112, 112, 112, 0.5), ), hintText: "Keyword", fillColor: Colors.white, filled: true, contentPadding: EdgeInsets.fromLTRB(0, 0, 0, 10), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(3), borderSide: BorderSide(color: Color.fromRGBO(112, 112, 112, 0.5))), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(3), borderSide: BorderSide(color: Color.fromRGBO(112, 112, 112, 0.5))), )); } _foundSearch(String string)async{ List results=[]; if(string.isEmpty){ results=_foundOffers; }else { results=_foundOffers.where((element) => element.schedule.toLowerCase().contains(string.toLowerCase())).toList(); pageNumber=pageNumber+1; for(;pageNumber+1<=totalPages;pageNumber++){ ApiResponseModel response =await _employmentOffersService.getAllOffers(size: 1,page: pageNumber); _foundOffers=_foundOffers+response.data.offers; employmentOffers=_foundOffers; results=_foundOffers.where((element) => element.schedule.toLowerCase().contains(string.toLowerCase())).toList(); } } setState(() { employmentOffers=results; }); } }