mod: 搜索页面完善

This commit is contained in:
guozhigq
2023-06-22 12:12:59 +08:00
parent 6c531ce5d3
commit bd6ff61c5f
6 changed files with 82 additions and 29 deletions

View File

@ -17,7 +17,7 @@ class SearchHttp {
} else { } else {
return { return {
'status': false, 'status': false,
'date': [], 'data': [],
'msg': '请求错误 🙅', 'msg': '请求错误 🙅',
}; };
} }
@ -36,7 +36,7 @@ class SearchHttp {
} else { } else {
return { return {
'status': false, 'status': false,
'date': [], 'data': [],
'msg': '请求错误 🙅', 'msg': '请求错误 🙅',
}; };
} }
@ -55,9 +55,8 @@ class SearchHttp {
'user_type': 0, 'user_type': 0,
'page': page 'page': page
}); });
if (res.data['code'] == 0) { if (res.data['code'] == 0 && res.data['data']['numPages'] > 0) {
var data; var data;
// log(res.data.toString());
switch (searchType) { switch (searchType) {
case SearchType.video: case SearchType.video:
data = SearchVideoModel.fromJson(res.data['data']); data = SearchVideoModel.fromJson(res.data['data']);
@ -69,7 +68,6 @@ class SearchHttp {
data = SearchUserModel.fromJson(res.data['data']); data = SearchUserModel.fromJson(res.data['data']);
break; break;
} }
return { return {
'status': true, 'status': true,
'data': data, 'data': data,
@ -77,8 +75,8 @@ class SearchHttp {
} else { } else {
return { return {
'status': false, 'status': false,
'date': [], 'data': [],
'msg': '请求错误 🙅', 'msg': res.data['data']['numPages'] == 0 ? '没有相关数据' : '请求错误 🙅',
}; };
} }
} }

View File

@ -5,6 +5,7 @@ import 'package:get/get.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
import 'package:pilipala/http/init.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/pages/video/detail/index.dart';
import 'package:pilipala/router/app_pages.dart'; import 'package:pilipala/router/app_pages.dart';
import 'package:pilipala/pages/main/view.dart'; import 'package:pilipala/pages/main/view.dart';
@ -56,7 +57,10 @@ class MyApp extends StatelessWidget {
getPages: Routes.getPages, getPages: Routes.getPages,
home: const MainApp(), home: const MainApp(),
builder: FlutterSmartDialog.init(), builder: FlutterSmartDialog.init(),
navigatorObservers: [VideoDetailPage.routeObserver], navigatorObservers: [
VideoDetailPage.routeObserver,
SearchPage.routeObserver
],
); );
}), }),
); );

View File

@ -60,7 +60,8 @@ class SearchVideoItemModel {
// String? review; // String? review;
int? pubdate; int? pubdate;
int? senddate; int? senddate;
String? duration; int? duration;
// String? duration;
// String? viewType; // String? viewType;
// String? like; // String? like;
// String? upic; // String? upic;
@ -81,12 +82,26 @@ class SearchVideoItemModel {
videoReview = json['video_review']; videoReview = json['video_review'];
pubdate = json['pubdate']; pubdate = json['pubdate'];
senddate = json['senddate']; senddate = json['senddate'];
duration = json['duration']; duration = test(json['duration']);
// duration = json['duration'];
owner = Owner.fromJson(json); owner = Owner.fromJson(json);
stat = Stat.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 { class Stat {
Stat({ Stat({
this.view, this.view,

View File

@ -1,5 +1,6 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'controller.dart'; import 'controller.dart';
@ -10,11 +11,27 @@ class SearchPage extends StatefulWidget {
@override @override
State<SearchPage> createState() => _SearchPageState(); State<SearchPage> createState() => _SearchPageState();
static final RouteObserver<PageRoute> routeObserver =
RouteObserver<PageRoute>();
} }
class _SearchPageState extends State<SearchPage> { class _SearchPageState extends State<SearchPage> with RouteAware {
final SearchController _searchController = Get.put(SearchController()); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -148,8 +165,12 @@ class _SearchPageState extends State<SearchPage> {
return HotKeyword( return HotKeyword(
width: width, width: width,
hotSearchList: _searchController.hotSearchList, hotSearchList: _searchController.hotSearchList,
onClick: (keyword) => onClick: (keyword) async {
_searchController.onClickKeyword(keyword), _searchController.searchFocusNode.unfocus();
await Future.delayed(
const Duration(milliseconds: 150));
_searchController.onClickKeyword(keyword);
},
); );
} else { } else {
return HttpError( return HttpError(

View File

@ -11,19 +11,14 @@ class SearchPanelController extends GetxController {
RxInt page = 1.obs; RxInt page = 1.obs;
RxList resultList = [].obs; RxList resultList = [].obs;
@override
void onInit() {
super.onInit();
}
Future onSearch({type = 'init'}) async { Future onSearch({type = 'init'}) async {
var result = await SearchHttp.searchByType( var result = await SearchHttp.searchByType(
searchType: searchType!, keyword: keyword!, page: page.value); searchType: searchType!, keyword: keyword!, page: page.value);
if (result['status']) { if (result['status']) {
if (type == 'init') { if (type == 'init' || type == 'onLoad') {
page.value++; page.value++;
resultList.addAll(result['data'].list); resultList.addAll(result['data'].list);
} else { } else if (type == 'onRefresh') {
resultList.value = result['data'].list; resultList.value = result['data'].list;
} }
} }
@ -32,7 +27,7 @@ class SearchPanelController extends GetxController {
Future onRefresh() async { Future onRefresh() async {
page.value = 1; page.value = 1;
onSearch(type: 'refresh'); onSearch(type: 'onRefresh');
} }
// 返回顶部并刷新 // 返回顶部并刷新

View File

@ -23,6 +23,8 @@ class _SearchPanelState extends State<SearchPanel>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
late SearchPanelController? _searchPanelController; late SearchPanelController? _searchPanelController;
bool _isLoadingMore = false;
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@ -30,11 +32,24 @@ class _SearchPanelState extends State<SearchPanel>
void initState() { void initState() {
super.initState(); super.initState();
_searchPanelController = Get.put( _searchPanelController = Get.put(
SearchPanelController( SearchPanelController(
keyword: widget.keyword, keyword: widget.keyword,
searchType: widget.searchType, searchType: widget.searchType,
), ),
tag: widget.searchType!.type); 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 @override
@ -71,9 +86,14 @@ class _SearchPanelState extends State<SearchPanel>
), ),
); );
} else { } else {
return HttpError( return CustomScrollView(
errMsg: data['msg'], physics: const NeverScrollableScrollPhysics(),
fn: () => setState(() {}), slivers: [
HttpError(
errMsg: data['msg'],
fn: () => setState(() {}),
),
],
); );
} }
} else { } else {