skywood/lib/pages/search/page/result_page.dart
2026-07-01 18:05:57 +08:00

199 lines
5.7 KiB
Dart

import 'package:flutter/material.dart';
import 'package:skywood/global/client/play_client.dart';
import 'package:skywood/main/lib_file.dart';
import 'package:skywood/pages/home/players/page/drama_detail_page.dart';
import 'package:skywood/pages/widgets/pixel_widgets.dart';
import 'package:skywood/utils/models/drama/skywood_drama.dart';
import 'package:skywood/utils/tools/app_toast.dart';
import 'package:skywood/utils/tools/sky_time_tool.dart';
import 'package:skywood/utils/tools/widgets/sky_app_bar.dart';
import 'package:skywood/utils/tools/widgets/sky_common_widget.dart';
import '../../../utils/tools/widgets/sky_text_field.dart';
import '../../like/widget/no_data_view.dart';
import '../widget/search_util.dart';
class ResultPage extends StatefulWidget {
const ResultPage({super.key,
required this.keyword,
});
final String keyword;
@override
State<StatefulWidget> createState() {
return _ResultPageState();
}
}
class _ResultPageState extends State<ResultPage> {
final _searchController = TextEditingController();
final _searchFocus = FocusNode();
List<SkywoodDrama> _searchResult = [];
bool _isLoading = false;
@override
void initState() {
super.initState();
_searchController.text = widget.keyword;
_search();
}
void _search() async {
String keyword = _searchController.text;
if (keyword.trim().isEmpty) {
_searchFocus.requestFocus();
return;
}
_isLoading = true;
AppToast.showLottieLoading();
await SearchUtil.addSearch(keyword);
PlayClient.search(keyword: keyword).then((valuer) {
_isLoading = false;
AppToast.dismiss();
setState(() {
_searchResult = valuer;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: SkyAppBar(
titleWidget: SkyTextField(
controller: _searchController,
focusNode: _searchFocus,
border: Border.all(width: 0.6, color: CommonColor.black),
borderRadius: BorderRadius.circular(20),
width: 300, height: 36,
placeholder: 'Search',
prefix: HelpImg.asset(ConstImg.search, width: 14.w, height: 14.w),
textInputAction: TextInputAction.search,
onEditingComplete: () {
_searchFocus.unfocus();
if (_searchController.text.trim().isEmpty) return;
_search();
},
),
),
body: _searchResult.isEmpty && !_isLoading ? NoDataView() : ListView.separated(
itemBuilder: (context, index) => ResultItemView(
drama: _searchResult[index],
onTap: () {
HelpNav.to(DramaDetailPage(dramaBean: _searchResult[index]));
},
),
separatorBuilder: (context, index) => SizedBox(height: 12),
itemCount: _searchResult.length
),
);
}
}
class ResultItemView extends StatelessWidget {
const ResultItemView({super.key,
required this.drama,
this.onTap
});
final SkywoodDrama drama;
final Function()? onTap;
@override
Widget build(BuildContext context) {
String tag = 'Satisfying';
if (drama.categoryList!.isNotEmpty) {
tag = drama.categoryList![0].name;
}
return Container(
height: 140.h,
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Row(
children: [
HelpImg.networkRadius(drama.imageUrl, width: 105.w, height: 140.h,
borderRadius: BorderRadius.circular(6),
fit: BoxFit.cover,
),
const SizedBox(width: 10),
Expanded(child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SkyText(text: drama.name,
fontSize: 14,
fontWeight: FontWeight.bold,
color: CommonColor.black,
),
const SizedBox(height: 12),
_tagView(tag),
const SizedBox(height: 12),
SkyText(text: '${drama.description}',
fontSize: 11,
color: CommonColor.withValue('4D4047'),
maxLines: 2,
),
Spacer(),
Row(
children: [
_tipView(true, text: SkyTimeTool.formatNum(drama.collectTotal, unit: 'k')),
const SizedBox(width: 15),
_tipView(false, text: SkyTimeTool.formatNum(drama.watchTotal, unit: 'k')),
],
)
],
))
],
),
).addInkWell(onTap: onTap);
}
Widget _tipView(bool isStar, {required String text}) {
String imgName = isStar ? ConstImg.star : ConstImg.look;
return Row(
children: [
HelpImg.asset(imgName, width: 12.w, height: 12.w),
const SizedBox(width: 2),
SkyText(text: text, fontSize: 10, color: Colors.grey)
],
);
}
Widget _tagView(String tag) {
return Container(
padding: const EdgeInsets.only(top: 3, left: 6, right: 6, bottom: 4),
decoration: ShapeDecoration(
color: const Color(0xFFEBFFE5),
shape: RoundedRectangleBorder(
side: BorderSide(
width: 0.50,
color: const Color(0xFF9BE89C),
),
borderRadius: BorderRadius.circular(1),
),
),
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
spacing: 10,
children: [
Text(
tag,
style: TextStyle(
color: const Color(0xFF040408) /* 主题黑 */,
fontSize: 10,
fontFamily: 'Inter',
fontWeight: FontWeight.w400,
height: 1,
),
),
],
),
);
}
}