opt: keep member search page

fix: search arc

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-04-11 18:50:29 +08:00
parent 02dee71670
commit c517df2c09
3 changed files with 39 additions and 19 deletions

View File

@@ -151,9 +151,9 @@ class MemberSearchController extends GetxController
isEndArchive = true; isEndArchive = true;
} }
archiveState.value = LoadingState.success(vlist); archiveState.value = LoadingState.success(vlist);
} else if (dynamicState.value is Success) { } else if (archiveState.value is Success) {
List<VListItemModel> currentList = List<VListItemModel> currentList =
(dynamicState.value as Success).response; (archiveState.value as Success).response;
currentList.addAll(vlist!); currentList.addAll(vlist!);
if (currentList.length >= archiveCount.value) { if (currentList.length >= archiveCount.value) {
isEndDynamic = true; isEndDynamic = true;

View File

@@ -9,7 +9,7 @@ import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart'; import 'package:get/get_state_manager/src/rx_flutter/rx_obx_widget.dart';
class SearchArchive extends StatelessWidget { class SearchArchive extends StatefulWidget {
const SearchArchive({ const SearchArchive({
super.key, super.key,
required this.ctr, required this.ctr,
@@ -17,9 +17,16 @@ class SearchArchive extends StatelessWidget {
final MemberSearchController ctr; final MemberSearchController ctr;
@override
State<SearchArchive> createState() => _SearchArchiveState();
}
class _SearchArchiveState extends State<SearchArchive>
with AutomaticKeepAliveClientMixin {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Obx(() => _buildBody(context, ctr.archiveState.value)); super.build(context);
return Obx(() => _buildBody(context, widget.ctr.archiveState.value));
} }
Widget _buildBody(BuildContext context, LoadingState loadingState) { Widget _buildBody(BuildContext context, LoadingState loadingState) {
@@ -28,7 +35,7 @@ class SearchArchive extends StatelessWidget {
Success() => (loadingState.response as List?)?.isNotEmpty == true Success() => (loadingState.response as List?)?.isNotEmpty == true
? refreshIndicator( ? refreshIndicator(
onRefresh: () async { onRefresh: () async {
await ctr.refreshArchive(); await widget.ctr.refreshArchive();
}, },
child: CustomScrollView( child: CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
@@ -49,7 +56,7 @@ class SearchArchive extends StatelessWidget {
if (index == loadingState.response.length - 1) { if (index == loadingState.response.length - 1) {
EasyThrottle.throttle('searchArchives', EasyThrottle.throttle('searchArchives',
const Duration(milliseconds: 500), () { const Duration(milliseconds: 500), () {
ctr.searchArchives(false); widget.ctr.searchArchives(false);
}); });
} }
return VideoCardH( return VideoCardH(
@@ -65,18 +72,21 @@ class SearchArchive extends StatelessWidget {
) )
: errorWidget( : errorWidget(
callback: () { callback: () {
ctr.archiveState.value = LoadingState.loading(); widget.ctr.archiveState.value = LoadingState.loading();
ctr.refreshArchive(); widget.ctr.refreshArchive();
}, },
), ),
Error() => errorWidget( Error() => errorWidget(
errMsg: loadingState.errMsg, errMsg: loadingState.errMsg,
callback: () { callback: () {
ctr.archiveState.value = LoadingState.loading(); widget.ctr.archiveState.value = LoadingState.loading();
ctr.refreshArchive(); widget.ctr.refreshArchive();
}, },
), ),
LoadingState() => throw UnimplementedError(), LoadingState() => throw UnimplementedError(),
}; };
} }
@override
bool get wantKeepAlive => true;
} }

View File

@@ -11,7 +11,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:waterfall_flow/waterfall_flow.dart'; import 'package:waterfall_flow/waterfall_flow.dart';
class SearchDynamic extends StatelessWidget { class SearchDynamic extends StatefulWidget {
const SearchDynamic({ const SearchDynamic({
super.key, super.key,
required this.ctr, required this.ctr,
@@ -19,9 +19,16 @@ class SearchDynamic extends StatelessWidget {
final MemberSearchController ctr; final MemberSearchController ctr;
@override
State<SearchDynamic> createState() => _SearchDynamicState();
}
class _SearchDynamicState extends State<SearchDynamic>
with AutomaticKeepAliveClientMixin {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Obx(() => _buildBody(context, ctr.dynamicState.value)); super.build(context);
return Obx(() => _buildBody(context, widget.ctr.dynamicState.value));
} }
Widget _buildBody(BuildContext context, LoadingState loadingState) { Widget _buildBody(BuildContext context, LoadingState loadingState) {
@@ -32,7 +39,7 @@ class SearchDynamic extends StatelessWidget {
Success() => (loadingState.response as List?)?.isNotEmpty == true Success() => (loadingState.response as List?)?.isNotEmpty == true
? refreshIndicator( ? refreshIndicator(
onRefresh: () async { onRefresh: () async {
await ctr.refreshDynamic(); await widget.ctr.refreshDynamic();
}, },
child: CustomScrollView( child: CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(), physics: const AlwaysScrollableScrollPhysics(),
@@ -50,7 +57,7 @@ class SearchDynamic extends StatelessWidget {
if (index == loadingState.response.length - 1) { if (index == loadingState.response.length - 1) {
EasyThrottle.throttle('member_dynamics', EasyThrottle.throttle('member_dynamics',
const Duration(milliseconds: 1000), () { const Duration(milliseconds: 1000), () {
ctr.searchDynamic(false); widget.ctr.searchDynamic(false);
}); });
} }
return index == loadingState.response.length return index == loadingState.response.length
@@ -74,7 +81,7 @@ class SearchDynamic extends StatelessWidget {
EasyThrottle.throttle('member_dynamics', EasyThrottle.throttle('member_dynamics',
const Duration(milliseconds: 1000), const Duration(milliseconds: 1000),
() { () {
ctr.searchDynamic(false); widget.ctr.searchDynamic(false);
}); });
} }
return DynamicPanel( return DynamicPanel(
@@ -94,18 +101,21 @@ class SearchDynamic extends StatelessWidget {
) )
: errorWidget( : errorWidget(
callback: () { callback: () {
ctr.dynamicState.value = LoadingState.loading(); widget.ctr.dynamicState.value = LoadingState.loading();
ctr.refreshDynamic(); widget.ctr.refreshDynamic();
}, },
), ),
Error() => errorWidget( Error() => errorWidget(
errMsg: loadingState.errMsg, errMsg: loadingState.errMsg,
callback: () { callback: () {
ctr.dynamicState.value = LoadingState.loading(); widget.ctr.dynamicState.value = LoadingState.loading();
ctr.refreshDynamic(); widget.ctr.refreshDynamic();
}, },
), ),
LoadingState() => throw UnimplementedError(), LoadingState() => throw UnimplementedError(),
}; };
} }
@override
bool get wantKeepAlive => true;
} }