refa: search dyn

Closes #641

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-04-08 22:05:17 +08:00
parent a34c18b262
commit 2d11158ecd
5 changed files with 28 additions and 150 deletions

View File

@@ -22,6 +22,7 @@ class MemberSearchController extends GetxController
bool isEndArchive = false;
Rx<LoadingState> archiveState = LoadingState.loading().obs;
String offset = '';
int dynamicPn = 1;
RxInt dynamicCount = (-1).obs;
bool isEndDynamic = false;
@@ -66,6 +67,7 @@ class MemberSearchController extends GetxController
}
Future refreshDynamic() async {
offset = '';
dynamicPn = 1;
isEndDynamic = false;
await searchDynamic();
@@ -82,12 +84,12 @@ class MemberSearchController extends GetxController
dynamic res = await MemberHttp.memberDynamicSearch(
mid: mid,
pn: dynamicPn,
ps: 30,
offset: offset,
keyword: textEditingController.text,
);
if (res['status']) {
if (isRefresh) {
dynamicCount.value = res['count'];
dynamicCount.value = res['count'] ?? -1;
}
if (isRefresh.not && dynamicState.value is Success) {
res['data'].insertAll(0, (dynamicState.value as Success).response);

View File

@@ -1,14 +1,12 @@
import 'dart:convert';
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/loading_widget.dart';
import 'package:PiliPlus/common/widgets/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/refresh_indicator.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/pages/dynamics/widgets/dynamic_panel.dart';
import 'package:PiliPlus/pages/member_search/controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/grid.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:easy_debounce/easy_throttle.dart';
@@ -63,7 +61,7 @@ class SearchDynamic extends StatelessWidget {
: LastChildLayoutType.none;
},
children: (loadingState.response as List)
.map((item) => _buildItem(context, item))
.map((item) => DynamicPanel(item: item))
.toList(),
)
: SliverCrossAxisGroup(
@@ -82,9 +80,8 @@ class SearchDynamic extends StatelessWidget {
ctr.searchDynamic(false);
});
}
return _buildItem(
context,
loadingState.response[index],
return DynamicPanel(
item: loadingState.response[index],
);
},
childCount: loadingState.response.length,
@@ -163,131 +160,4 @@ class SearchDynamic extends StatelessWidget {
],
);
}
Widget _buildItem(context, item) {
try {
dynamic json = jsonDecode('${item['card']}');
return switch (item['desc']['type']) {
1 => _buildDynamic(
context: context,
id: item['desc']['dynamic_id_str'],
face: json['user']['face'],
name: json['user']['uname'],
vip: item['desc']['user_profile']['vip'],
pubTime: item['desc']['timestamp'],
content: json['item']['content'],
),
2 => _buildDynamic(
context: context,
id: item['desc']['dynamic_id_str'],
face: json['user']['head_url'],
name: json['user']['name'],
vip: json['user']['vip'],
pubTime: json['item']['upload_time'],
content: json['item']['description'],
),
4 => _buildDynamic(
context: context,
id: item['desc']['dynamic_id_str'],
face: json['user']['face'],
name: json['user']['uname'],
vip: item['desc']['user_profile']['vip'],
pubTime: item['desc']['timestamp'],
content: json['item']['content'],
),
8 => _buildVideo(context, json),
_ => _buildDef(item),
};
} catch (e) {
debugPrint('$e');
return _buildDef(item);
}
}
_buildDynamic({
required dynamic id,
required BuildContext context,
required String face,
required String name,
required dynamic vip,
required dynamic pubTime,
required String content,
}) {
return InkWell(
onTap: () {
Utils.pushDynFromId(id);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildHeader(
context: context,
face: face,
name: name,
vip: vip,
pubTime: pubTime,
),
const SizedBox(height: 5),
Text(
content,
style: TextStyle(fontSize: 15),
)
],
),
),
);
}
_buildVideo(context, json) {
return ListTile(
dense: true,
onTap: () {
Utils.toViewPage(
'bvid=${IdUtils.av2bv(json['aid'])}&cid=${json['cid']}',
arguments: {
'heroTag': Utils.makeHeroTag(json['aid']),
},
);
},
title: Text(
'${json['title']}',
maxLines: 20,
style: TextStyle(fontSize: 15),
),
subtitle: Text(
'${Utils.dateFormat(json['pubdate'])} · ${Utils.numFormat(json['stat']['view'])}观看 · ${Utils.numFormat(json['stat']['danmaku'])}弹幕',
style: TextStyle(
fontSize: 13,
color: Theme.of(context).colorScheme.outline,
),
),
leading: (json['pic'] as String?)?.isNotEmpty == true
? Container(
margin: const EdgeInsets.symmetric(vertical: 6),
child: LayoutBuilder(
builder: (context, constraints) {
return NetworkImgLayer(
radius: 6,
src: json['pic'],
width: constraints.maxHeight * StyleString.aspectRatio,
height: constraints.maxHeight,
);
},
),
)
: null,
);
}
_buildDef(item) => ListTile(
dense: true,
onTap: () {
Utils.copyText(jsonEncode(item));
},
title: Text('$item'),
subtitle: Text('${item['desc']['type']}'),
);
}