diff --git a/lib/http/search.dart b/lib/http/search.dart index 484f6ae5..03345842 100644 --- a/lib/http/search.dart +++ b/lib/http/search.dart @@ -17,7 +17,7 @@ class SearchHttp { } else { return { 'status': false, - 'date': [], + 'data': [], 'msg': '请求错误 🙅', }; } @@ -36,7 +36,7 @@ class SearchHttp { } else { return { 'status': false, - 'date': [], + 'data': [], 'msg': '请求错误 🙅', }; } @@ -55,9 +55,8 @@ class SearchHttp { 'user_type': 0, 'page': page }); - if (res.data['code'] == 0) { + if (res.data['code'] == 0 && res.data['data']['numPages'] > 0) { var data; - // log(res.data.toString()); switch (searchType) { case SearchType.video: data = SearchVideoModel.fromJson(res.data['data']); @@ -69,7 +68,6 @@ class SearchHttp { data = SearchUserModel.fromJson(res.data['data']); break; } - return { 'status': true, 'data': data, @@ -77,8 +75,8 @@ class SearchHttp { } else { return { 'status': false, - 'date': [], - 'msg': '请求错误 🙅', + 'data': [], + 'msg': res.data['data']['numPages'] == 0 ? '没有相关数据' : '请求错误 🙅', }; } } diff --git a/lib/main.dart b/lib/main.dart index 416c83cb..e6ab6110 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -5,6 +5,7 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; import 'package:dynamic_color/dynamic_color.dart'; import 'package:pilipala/http/init.dart'; +import 'package:pilipala/pages/search/index.dart'; import 'package:pilipala/pages/video/detail/index.dart'; import 'package:pilipala/router/app_pages.dart'; import 'package:pilipala/pages/main/view.dart'; @@ -56,7 +57,10 @@ class MyApp extends StatelessWidget { getPages: Routes.getPages, home: const MainApp(), builder: FlutterSmartDialog.init(), - navigatorObservers: [VideoDetailPage.routeObserver], + navigatorObservers: [ + VideoDetailPage.routeObserver, + SearchPage.routeObserver + ], ); }), ); diff --git a/lib/models/search/result.dart b/lib/models/search/result.dart index 3183a675..3a932851 100644 --- a/lib/models/search/result.dart +++ b/lib/models/search/result.dart @@ -60,7 +60,8 @@ class SearchVideoItemModel { // String? review; int? pubdate; int? senddate; - String? duration; + int? duration; + // String? duration; // String? viewType; // String? like; // String? upic; @@ -81,12 +82,26 @@ class SearchVideoItemModel { videoReview = json['video_review']; pubdate = json['pubdate']; senddate = json['senddate']; - duration = json['duration']; + duration = test(json['duration']); + // duration = json['duration']; owner = Owner.fromJson(json); stat = Stat.fromJson(json); } } +test(String duration) { + List timeList = duration.split(':'); + int len = timeList.length; + if (len == 2) { + return int.parse(timeList[0]) * 60 + int.parse(timeList[1]); + } + if (len == 3) { + return int.parse(timeList[0]) * 3600 + + int.parse(timeList[1]) * 60 + + timeList[2]; + } +} + class Stat { Stat({ this.view, diff --git a/lib/pages/search/view.dart b/lib/pages/search/view.dart index 4287f72d..38277285 100644 --- a/lib/pages/search/view.dart +++ b/lib/pages/search/view.dart @@ -1,5 +1,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/widgets/http_error.dart'; import 'controller.dart'; @@ -10,11 +11,27 @@ class SearchPage extends StatefulWidget { @override State createState() => _SearchPageState(); + static final RouteObserver routeObserver = + RouteObserver(); } -class _SearchPageState extends State { +class _SearchPageState extends State with RouteAware { final SearchController _searchController = Get.put(SearchController()); + @override + // 返回当前页面时 + void didPopNext() async { + _searchController.searchFocusNode.requestFocus(); + super.didPopNext(); + } + + @override + void didChangeDependencies() { + super.didChangeDependencies(); + SearchPage.routeObserver + .subscribe(this, ModalRoute.of(context) as PageRoute); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -148,8 +165,12 @@ class _SearchPageState extends State { return HotKeyword( width: width, hotSearchList: _searchController.hotSearchList, - onClick: (keyword) => - _searchController.onClickKeyword(keyword), + onClick: (keyword) async { + _searchController.searchFocusNode.unfocus(); + await Future.delayed( + const Duration(milliseconds: 150)); + _searchController.onClickKeyword(keyword); + }, ); } else { return HttpError( diff --git a/lib/pages/searchPanel/controller.dart b/lib/pages/searchPanel/controller.dart index 4f31968c..640ae246 100644 --- a/lib/pages/searchPanel/controller.dart +++ b/lib/pages/searchPanel/controller.dart @@ -11,19 +11,14 @@ class SearchPanelController extends GetxController { RxInt page = 1.obs; RxList resultList = [].obs; - @override - void onInit() { - super.onInit(); - } - Future onSearch({type = 'init'}) async { var result = await SearchHttp.searchByType( searchType: searchType!, keyword: keyword!, page: page.value); if (result['status']) { - if (type == 'init') { + if (type == 'init' || type == 'onLoad') { page.value++; resultList.addAll(result['data'].list); - } else { + } else if (type == 'onRefresh') { resultList.value = result['data'].list; } } @@ -32,7 +27,7 @@ class SearchPanelController extends GetxController { Future onRefresh() async { page.value = 1; - onSearch(type: 'refresh'); + onSearch(type: 'onRefresh'); } // 返回顶部并刷新 diff --git a/lib/pages/searchPanel/view.dart b/lib/pages/searchPanel/view.dart index 339f6439..1c004324 100644 --- a/lib/pages/searchPanel/view.dart +++ b/lib/pages/searchPanel/view.dart @@ -23,6 +23,8 @@ class _SearchPanelState extends State with AutomaticKeepAliveClientMixin { late SearchPanelController? _searchPanelController; + bool _isLoadingMore = false; + @override bool get wantKeepAlive => true; @@ -30,11 +32,24 @@ class _SearchPanelState extends State void initState() { super.initState(); _searchPanelController = Get.put( - SearchPanelController( - keyword: widget.keyword, - searchType: widget.searchType, - ), - tag: widget.searchType!.type); + SearchPanelController( + keyword: widget.keyword, + searchType: widget.searchType, + ), + tag: widget.searchType!.type, + ); + ScrollController scrollController = + _searchPanelController!.scrollController; + scrollController.addListener(() async { + if (scrollController.position.pixels >= + scrollController.position.maxScrollExtent - 100) { + if (!_isLoadingMore) { + _isLoadingMore = true; + await _searchPanelController!.onSearch(type: 'onLoad'); + _isLoadingMore = false; + } + } + }); } @override @@ -71,9 +86,14 @@ class _SearchPanelState extends State ), ); } else { - return HttpError( - errMsg: data['msg'], - fn: () => setState(() {}), + return CustomScrollView( + physics: const NeverScrollableScrollPhysics(), + slivers: [ + HttpError( + errMsg: data['msg'], + fn: () => setState(() {}), + ), + ], ); } } else {