opt: login/logout

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-01-08 13:23:11 +08:00
parent c77ceea262
commit e06a3d8f22
17 changed files with 174 additions and 237 deletions

View File

@@ -30,8 +30,9 @@ class DynamicsController extends GetxController
RxList<int> tempBannedList = <int>[].obs;
late List<Widget> tabsPageList;
RxInt initialValue = 0.obs;
RxBool userLogin = false.obs;
dynamic userInfo;
RxBool isLogin = false.obs;
dynamic ownerMid;
dynamic face;
RxBool isLoadingDynamic = false.obs;
List<UpItem> hasUpdatedUps = <UpItem>[];
List<UpItem> allFollowedUps = <UpItem>[];
@@ -40,10 +41,13 @@ class DynamicsController extends GetxController
@override
void onInit() {
userInfo = GStorage.userInfo.get('userInfoCache');
userLogin.value = userInfo != null;
super.onInit();
dynamic userInfo = GStorage.userInfo.get('userInfoCache');
ownerMid = userInfo?.mid;
face = userInfo?.face;
isLogin.value = userInfo != null;
tabController = TabController(
length: tabsConfig.length,
vsync: this,
@@ -52,9 +56,7 @@ class DynamicsController extends GetxController
);
tabsPageList =
tabsConfig.map((e) => DynamicsTabPage(dynamicsType: e['tag'])).toList();
}
void refreshNotifier() {
queryFollowUp();
}
@@ -223,7 +225,7 @@ class DynamicsController extends GetxController
return;
}
var res = await FollowHttp.followings(
vmid: userInfo.mid,
vmid: ownerMid,
pn: allFollowedUpsPage,
ps: 50,
orderType: 'attention',
@@ -246,9 +248,11 @@ class DynamicsController extends GetxController
}
Future queryFollowUp({type = 'init'}) async {
if (!userLogin.value) {
return {'status': false, 'msg': '账号未登录'};
if (!isLogin.value) {
upData.value.errMsg = '账号未登录';
upData.refresh();
}
upData.value.errMsg = null;
if (type == 'init') {
upData.value.upList = [];
upData.value.liveUsers = LiveUsers();
@@ -258,13 +262,16 @@ class DynamicsController extends GetxController
allFollowedUpsPage = 1;
Future f1 = DynamicsHttp.followUp();
Future f2 = FollowHttp.followings(
vmid: userInfo.mid,
pn: allFollowedUpsPage,
ps: 50,
orderType: 'attention');
vmid: ownerMid,
pn: allFollowedUpsPage,
ps: 50,
orderType: 'attention',
);
List<dynamic> ress = await Future.wait([f1, f2]);
if (!ress[0]['status']) {
SmartDialog.showToast("获取关注动态失败:${ress[0]['msg']}");
upData.value.errMsg = ress[0]['msg'];
upData.refresh();
} else {
upData.value.liveUsers = ress[0]['data'].liveUsers;
hasUpdatedUps = ress[0]['data'].upList!;
@@ -286,16 +293,18 @@ class DynamicsController extends GetxController
}
upData.value.upList =
allFollowedUpsTotal > 0 ? allFollowedUps : hasUpdatedUps;
return ress[0];
}
var res = await DynamicsHttp.followUp();
if (res['status']) {
upData.value = res['data'];
if (upData.value.upList!.isEmpty) {
mid.value = -1;
} else {
var res = await DynamicsHttp.followUp();
if (res['status']) {
upData.value = res['data'];
if (upData.value.upList!.isEmpty) {
mid.value = -1;
}
} else {
upData.value.errMsg = res['msg'];
upData.refresh();
}
}
return res;
}
onSelectUp(mid) async {
@@ -308,8 +317,8 @@ class DynamicsController extends GetxController
}
onRefresh() async {
queryFollowUp();
await Future.wait(<Future>[
queryFollowUp(),
Get.find<DynamicsTabController>(
tag: tabsConfig[tabController.index]['tag'])
.onRefresh()

View File

@@ -1,7 +1,6 @@
import 'dart:async';
import 'dart:io';
import 'package:PiliPlus/common/widgets/http_error.dart';
import 'package:PiliPlus/http/msg.dart';
import 'package:PiliPlus/models/common/dynamics_type.dart';
import 'package:PiliPlus/models/common/up_panel_position.dart';
@@ -15,7 +14,6 @@ import 'package:PiliPlus/utils/storage.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:nil/nil.dart';
import 'controller.dart';
import 'widgets/up_panel.dart';
@@ -42,9 +40,7 @@ class DynamicsPage extends StatefulWidget {
class _DynamicsPageState extends State<DynamicsPage>
with AutomaticKeepAliveClientMixin, SingleTickerProviderStateMixin {
final DynamicsController _dynamicsController = Get.put(DynamicsController());
late Future _futureBuilderFutureUp;
late UpPanelPosition upPanelPosition;
StreamSubscription? _listener;
@override
bool get wantKeepAlive => true;
@@ -64,7 +60,7 @@ class _DynamicsPageState extends State<DynamicsPage>
}),
),
onPressed: () {
if (GStorage.isLogin) {
if (_dynamicsController.isLogin.value) {
showModalBottomSheet(
context: context,
useSafeArea: true,
@@ -85,24 +81,6 @@ class _DynamicsPageState extends State<DynamicsPage>
@override
void initState() {
super.initState();
_futureBuilderFutureUp = _dynamicsController.queryFollowUp();
// _dynamicsController.tabController =
// TabController(vsync: this, length: DynamicsType.values.length);
// ..addListener(() {
// if (!_dynamicsController.tabController.indexIsChanging) {
// // if (!mounted) return;
// // debugPrint('indexChanging: ${_dynamicsController.tabController.index}');
// _dynamicsController
// .onSelectType(_dynamicsController.tabController.index);
// }
// });
_listener = _dynamicsController.userLogin.listen((status) {
if (mounted) {
setState(() {
_futureBuilderFutureUp = _dynamicsController.queryFollowUp();
});
}
});
upPanelPosition = UpPanelPosition.values[GStorage.setting.get(
SettingBoxKey.upPanelPosition,
defaultValue: UpPanelPosition.leftFixed.index)];
@@ -123,7 +101,6 @@ class _DynamicsPageState extends State<DynamicsPage>
@override
void dispose() {
_listener?.cancel();
_dynamicsController.tabController.removeListener(() {});
_dynamicsController.scrollController.removeListener(() {});
super.dispose();
@@ -136,41 +113,25 @@ class _DynamicsPageState extends State<DynamicsPage>
? Theme.of(context).colorScheme.surface
: Colors.transparent,
width: 64,
child: FutureBuilder(
future: _futureBuilderFutureUp,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.data == null) {
return nil;
}
// TODO: refactor
if (snapshot.data is! Map) {
return HttpError(
isSliver: false,
callback: () => setState(() {
_futureBuilderFutureUp = _dynamicsController.queryFollowUp();
}),
);
}
Map data = snapshot.data;
if (data['status']) {
return Obx(() => UpPanel(_dynamicsController.upData.value,
_dynamicsController.scrollController));
} else {
return Center(
child: IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
setState(() {
_futureBuilderFutureUp =
_dynamicsController.queryFollowUp();
});
},
),
);
}
child: Obx(
() {
if (_dynamicsController.upData.value.upList == null &&
_dynamicsController.upData.value.liveUsers == null) {
return const SizedBox.shrink();
} else if (_dynamicsController.upData.value.errMsg != null) {
return Center(
child: IconButton(
icon: Icon(Icons.refresh),
onPressed: () {
_dynamicsController.queryFollowUp();
},
),
);
} else {
return nil;
return UpPanel(
key: ValueKey(_dynamicsController.upData.value),
dynamicsController: _dynamicsController,
);
}
},
),

View File

@@ -1,17 +1,19 @@
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/utils/extension.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:PiliPlus/common/widgets/network_img_layer.dart';
import 'package:PiliPlus/models/dynamics/up.dart';
import 'package:PiliPlus/models/live/item.dart';
import 'package:PiliPlus/pages/dynamics/controller.dart';
import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/utils.dart';
class UpPanel extends StatefulWidget {
final FollowUpModel? upData;
final ScrollController scrollController;
const UpPanel(this.upData, this.scrollController, {super.key});
final DynamicsController dynamicsController;
const UpPanel({
required this.dynamicsController,
super.key,
});
@override
State<UpPanel> createState() => _UpPanelState();
@@ -19,27 +21,21 @@ class UpPanel extends StatefulWidget {
class _UpPanelState extends State<UpPanel> {
int currentMid = -1;
List<UpItem> upList = [];
List<LiveUserItem> liveList = [];
dynamic userInfo;
List<UpItem> get upList =>
widget.dynamicsController.upData.value.upList ?? <UpItem>[];
List<LiveUserItem> get liveList =>
widget.dynamicsController.upData.value.liveUsers?.items ??
<LiveUserItem>[];
bool _showLiveItems = false;
late DynamicsController dynamicsController;
@override
void initState() {
super.initState();
userInfo = GStorage.userInfo.get('userInfoCache');
dynamicsController = Get.find<DynamicsController>();
}
@override
Widget build(BuildContext context) {
upList = widget.upData!.upList!;
liveList = widget.upData!.liveUsers?.items ?? [];
// return const SizedBox();
if (widget.dynamicsController.isLogin.value.not) {
return const SizedBox.shrink();
}
return CustomScrollView(
physics: const AlwaysScrollableScrollPhysics(),
controller: widget.scrollController,
controller: widget.dynamicsController.scrollController,
slivers: [
SliverToBoxAdapter(
child: SizedBox(
@@ -93,9 +89,9 @@ class _UpPanelState extends State<UpPanel> {
upItemBuild(UpItem(face: '', uname: '全部动态', mid: -1), 0),
upItemBuild(
UpItem(
face: userInfo?.face,
uname: '',
mid: userInfo?.mid,
face: widget.dynamicsController.face,
mid: widget.dynamicsController.ownerMid,
),
1,
),
@@ -120,8 +116,9 @@ class _UpPanelState extends State<UpPanel> {
if (data.type == 'up') {
currentMid = data.mid;
// dynamicsController.mid.value = data.mid;
dynamicsController.upInfo.value = data;
dynamicsController.onSelectUp(data.mid);
widget.dynamicsController
..upInfo.value = data
..onSelectUp(data.mid);
// int liveLen = liveList.length;
// int upLen = upList.length;
// double itemWidth = contentWidth + itemPadding.horizontal;