mod: 搜索页面完善
This commit is contained in:
@ -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 ? '没有相关数据' : '请求错误 🙅',
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
],
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
@ -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,
|
||||||
|
@ -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(
|
||||||
|
@ -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');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回顶部并刷新
|
// 返回顶部并刷新
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user