Merge branch 'design' into alpha

This commit is contained in:
guozhigq
2023-08-31 22:42:07 +08:00
14 changed files with 168 additions and 102 deletions

View File

@ -70,9 +70,17 @@ class NetworkImgLayer extends StatelessWidget {
Widget placeholder(context) { Widget placeholder(context) {
return Container( return Container(
color: Theme.of(context).colorScheme.onInverseSurface.withOpacity(0.4),
width: width ?? double.infinity, width: width ?? double.infinity,
height: height ?? double.infinity, height: height ?? double.infinity,
clipBehavior: Clip.hardEdge,
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.onInverseSurface.withOpacity(0.4),
borderRadius: BorderRadius.circular(type == 'avatar'
? 50
: type == 'emote'
? 0
: StyleString.imgRadius.x),
),
child: Center( child: Center(
child: Image.asset( child: Image.asset(
type == 'avatar' type == 'avatar'

View File

@ -11,7 +11,6 @@ import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/no_data.dart'; import 'package:pilipala/common/widgets/no_data.dart';
import 'package:pilipala/models/dynamics/result.dart'; import 'package:pilipala/models/dynamics/result.dart';
import 'package:pilipala/pages/main/index.dart'; import 'package:pilipala/pages/main/index.dart';
import 'package:pilipala/utils/event_bus.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -32,7 +31,6 @@ class _DynamicsPageState extends State<DynamicsPage>
late Future _futureBuilderFuture; late Future _futureBuilderFuture;
late Future _futureBuilderFutureUp; late Future _futureBuilderFutureUp;
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
EventBus eventBus = EventBus();
late ScrollController scrollController; late ScrollController scrollController;
@override @override
@ -66,12 +64,13 @@ class _DynamicsPageState extends State<DynamicsPage>
}, },
); );
eventBus.on(EventName.loginEvent, (args) { _dynamicsController.userLogin.listen((status) {
_dynamicsController.userLogin.value = args['status']; if (mounted) {
setState(() { setState(() {
_futureBuilderFuture = _dynamicsController.queryFollowDynamic(); _futureBuilderFuture = _dynamicsController.queryFollowDynamic();
_futureBuilderFutureUp = _dynamicsController.queryFollowUp(); _futureBuilderFutureUp = _dynamicsController.queryFollowUp();
}); });
}
}); });
} }

View File

@ -1,3 +1,4 @@
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/http/fan.dart'; import 'package:pilipala/http/fan.dart';
@ -7,11 +8,13 @@ import 'package:pilipala/utils/storage.dart';
class FansController extends GetxController { class FansController extends GetxController {
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
int pn = 1; int pn = 1;
int ps = 20;
int total = 0; int total = 0;
RxList<FansItemModel> fansList = [FansItemModel()].obs; RxList<FansItemModel> fansList = [FansItemModel()].obs;
late int mid; late int mid;
late String name; late String name;
var userInfo; var userInfo;
RxString loadingText = '加载中...'.obs;
@override @override
void onInit() { void onInit() {
@ -26,23 +29,31 @@ class FansController extends GetxController {
Future queryFans(type) async { Future queryFans(type) async {
if (type == 'init') { if (type == 'init') {
pn = 1; pn = 1;
loadingText.value == '加载中...';
}
if (loadingText.value == '没有更多了') {
return;
} }
var res = await FanHttp.fans( var res = await FanHttp.fans(
vmid: mid, vmid: mid,
pn: pn, pn: pn,
ps: 20, ps: ps,
orderType: 'attention', orderType: 'attention',
); );
if (res['status']) { if (res['status']) {
if (type == 'init') { if (type == 'init') {
fansList.value = res['data'].list; fansList.value = res['data'].list;
total = res['data'].total; total = res['data'].total;
} else if (type == 'onRefresh') {
fansList.insertAll(0, res['data'].list);
} else if (type == 'onLoad') { } else if (type == 'onLoad') {
fansList.addAll(res['data'].list); fansList.addAll(res['data'].list);
} }
print(total);
if ((pn == 1 && total < ps) || res['data'].list.isEmpty) {
loadingText.value = '没有更多了';
}
pn += 1; pn += 1;
} else {
SmartDialog.showToast(res['msg']);
} }
return res; return res;
} }

View File

@ -1,6 +1,8 @@
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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 'package:pilipala/common/widgets/no_data.dart';
import 'package:pilipala/models/fans/result.dart'; import 'package:pilipala/models/fans/result.dart';
import 'controller.dart'; import 'controller.dart';
@ -17,7 +19,6 @@ class _FansPageState extends State<FansPage> {
final FansController _fansController = Get.put(FansController()); final FansController _fansController = Get.put(FansController());
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
Future? _futureBuilderFuture; Future? _futureBuilderFuture;
bool _isLoadingMore = false;
@override @override
void initState() { void initState() {
@ -27,11 +28,9 @@ class _FansPageState extends State<FansPage> {
() async { () async {
if (scrollController.position.pixels >= if (scrollController.position.pixels >=
scrollController.position.maxScrollExtent - 200) { scrollController.position.maxScrollExtent - 200) {
if (!_isLoadingMore) { EasyThrottle.throttle('follow', const Duration(seconds: 1), () {
_isLoadingMore = true; _fansController.queryFans('onLoad');
await _fansController.queryFans('onLoad'); });
_isLoadingMore = false;
}
} }
}, },
); );
@ -66,14 +65,38 @@ class _FansPageState extends State<FansPage> {
if (data['status']) { if (data['status']) {
List<FansItemModel> list = _fansController.fansList; List<FansItemModel> list = _fansController.fansList;
return Obx( return Obx(
() => list.length == 1 () => list.isNotEmpty
? const SizedBox() ? ListView.builder(
: ListView.builder(
controller: scrollController, controller: scrollController,
itemCount: list.length, itemCount: list.length + 1,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return fanItem(item: list[index]); if (index == list.length) {
return Container(
height:
MediaQuery.of(context).padding.bottom + 60,
padding: EdgeInsets.only(
bottom:
MediaQuery.of(context).padding.bottom),
child: Center(
child: Obx(
() => Text(
_fansController.loadingText.value,
style: TextStyle(
color: Theme.of(context)
.colorScheme
.outline,
fontSize: 13),
),
),
),
);
} else {
return fanItem(item: list[index]);
}
}, },
)
: const CustomScrollView(
slivers: [NoData()],
), ),
); );
} else { } else {

View File

@ -1,3 +1,4 @@
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/http/follow.dart'; import 'package:pilipala/http/follow.dart';
@ -7,11 +8,13 @@ import 'package:pilipala/utils/storage.dart';
class FollowController extends GetxController { class FollowController extends GetxController {
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
int pn = 1; int pn = 1;
int ps = 20;
int total = 0; int total = 0;
RxList<FollowItemModel> followList = [FollowItemModel()].obs; RxList<FollowItemModel> followList = [FollowItemModel()].obs;
late int mid; late int mid;
late String name; late String name;
var userInfo; var userInfo;
RxString loadingText = '加载中...'.obs;
@override @override
void onInit() { void onInit() {
@ -26,23 +29,30 @@ class FollowController extends GetxController {
Future queryFollowings(type) async { Future queryFollowings(type) async {
if (type == 'init') { if (type == 'init') {
pn = 1; pn = 1;
loadingText.value == '加载中...';
}
if (loadingText.value == '没有更多了') {
return;
} }
var res = await FollowHttp.followings( var res = await FollowHttp.followings(
vmid: mid, vmid: mid,
pn: pn, pn: pn,
ps: 20, ps: ps,
orderType: 'attention', orderType: 'attention',
); );
if (res['status']) { if (res['status']) {
if (type == 'init') { if (type == 'init') {
followList.value = res['data'].list; followList.value = res['data'].list;
total = res['data'].total; total = res['data'].total;
} else if (type == 'onRefresh') {
followList.insertAll(0, res['data'].list);
} else if (type == 'onLoad') { } else if (type == 'onLoad') {
followList.addAll(res['data'].list); followList.addAll(res['data'].list);
} }
if ((pn == 1 && total < ps) || res['data'].list.isEmpty) {
loadingText.value = '没有更多了';
}
pn += 1; pn += 1;
} else {
SmartDialog.showToast(res['msg']);
} }
return res; return res;
} }

View File

@ -1,6 +1,8 @@
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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 'package:pilipala/common/widgets/no_data.dart';
import 'package:pilipala/models/follow/result.dart'; import 'package:pilipala/models/follow/result.dart';
import 'controller.dart'; import 'controller.dart';
@ -17,7 +19,6 @@ class _FollowPageState extends State<FollowPage> {
final FollowController _followController = Get.put(FollowController()); final FollowController _followController = Get.put(FollowController());
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
Future? _futureBuilderFuture; Future? _futureBuilderFuture;
bool _isLoadingMore = false;
@override @override
void initState() { void initState() {
@ -27,11 +28,9 @@ class _FollowPageState extends State<FollowPage> {
() async { () async {
if (scrollController.position.pixels >= if (scrollController.position.pixels >=
scrollController.position.maxScrollExtent - 200) { scrollController.position.maxScrollExtent - 200) {
if (!_isLoadingMore) { EasyThrottle.throttle('follow', const Duration(seconds: 1), () {
_isLoadingMore = true; _followController.queryFollowings('onLoad');
await _followController.queryFollowings('onLoad'); });
_isLoadingMore = false;
}
} }
}, },
); );
@ -67,14 +66,40 @@ class _FollowPageState extends State<FollowPage> {
if (data['status']) { if (data['status']) {
List<FollowItemModel> list = _followController.followList; List<FollowItemModel> list = _followController.followList;
return Obx( return Obx(
() => list.length == 1 () => list.isNotEmpty
? const SizedBox() ? ListView.builder(
: ListView.builder(
controller: scrollController, controller: scrollController,
itemCount: list.length, itemCount: list.length + 1,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return followItem(item: list[index]); if (index == list.length) {
return Container(
height:
MediaQuery.of(context).padding.bottom +
60,
padding: EdgeInsets.only(
bottom: MediaQuery.of(context)
.padding
.bottom),
child: Center(
child: Obx(
() => Text(
_followController.loadingText.value,
style: TextStyle(
color: Theme.of(context)
.colorScheme
.outline,
fontSize: 13),
),
),
),
);
} else {
return followItem(item: list[index]);
}
}, },
)
: const CustomScrollView(
slivers: [NoData()],
), ),
); );
} else { } else {

View File

@ -48,9 +48,10 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
} }
// 更新登录状态 // 更新登录状态
void updateLoginStatus(val) { void updateLoginStatus(val) async {
userInfo = userInfoCache.get('userInfoCache'); userInfo = await userInfoCache.get('userInfoCache');
userLogin.value = val ?? false; userLogin.value = val ?? false;
if (val) return;
userFace.value = userInfo != null ? userInfo.face : ''; userFace.value = userInfo != null ? userInfo.face : '';
} }
} }

View File

@ -134,11 +134,13 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
() => ctr!.userLogin.value () => ctr!.userLogin.value
? Stack( ? Stack(
children: [ children: [
NetworkImgLayer( Obx(
type: 'avatar', () => NetworkImgLayer(
width: 34, type: 'avatar',
height: 34, width: 34,
src: ctr!.userFace.value, height: 34,
src: ctr!.userFace.value,
),
), ),
Positioned.fill( Positioned.fill(
child: Material( child: Material(

View File

@ -35,6 +35,7 @@ class MediaController extends GetxController {
}, },
]; ];
var userInfo; var userInfo;
int? mid;
@override @override
void onInit() { void onInit() {
@ -44,13 +45,13 @@ class MediaController extends GetxController {
} }
Future<dynamic> queryFavFolder() async { Future<dynamic> queryFavFolder() async {
if (!userLogin.value || GStrorage.userInfo.get('userInfoCache') == null) { if (!userLogin.value) {
return {'status': false, 'data': [], 'msg': '未登录'}; return {'status': false, 'data': [], 'msg': '未登录'};
} }
var res = await await UserHttp.userfavFolder( var res = await await UserHttp.userfavFolder(
pn: 1, pn: 1,
ps: 5, ps: 5,
mid: GStrorage.userInfo.get('userInfoCache').mid, mid: mid ?? GStrorage.userInfo.get('userInfoCache').mid,
); );
favFolderData.value = res['data']; favFolderData.value = res['data'];
return res; return res;

View File

@ -3,7 +3,6 @@ import 'package:get/get.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/user/fav_folder.dart'; import 'package:pilipala/models/user/fav_folder.dart';
import 'package:pilipala/pages/media/index.dart'; import 'package:pilipala/pages/media/index.dart';
import 'package:pilipala/utils/event_bus.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
class MediaPage extends StatefulWidget { class MediaPage extends StatefulWidget {
@ -17,7 +16,6 @@ class _MediaPageState extends State<MediaPage>
with AutomaticKeepAliveClientMixin { with AutomaticKeepAliveClientMixin {
late MediaController mediaController; late MediaController mediaController;
late Future _futureBuilderFuture; late Future _futureBuilderFuture;
EventBus eventBus = EventBus();
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@ -27,8 +25,8 @@ class _MediaPageState extends State<MediaPage>
super.initState(); super.initState();
mediaController = Get.put(MediaController()); mediaController = Get.put(MediaController());
_futureBuilderFuture = mediaController.queryFavFolder(); _futureBuilderFuture = mediaController.queryFavFolder();
eventBus.on(EventName.loginEvent, (args) {
mediaController.userLogin.value = args['status']; mediaController.userLogin.listen((status) {
setState(() { setState(() {
_futureBuilderFuture = mediaController.queryFavFolder(); _futureBuilderFuture = mediaController.queryFavFolder();
}); });

View File

@ -7,7 +7,6 @@ import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/common/theme_type.dart'; import 'package:pilipala/models/common/theme_type.dart';
import 'package:pilipala/models/user/info.dart'; import 'package:pilipala/models/user/info.dart';
import 'package:pilipala/utils/event_bus.dart';
import 'controller.dart'; import 'controller.dart';
class MinePage extends StatefulWidget { class MinePage extends StatefulWidget {
@ -20,14 +19,13 @@ class MinePage extends StatefulWidget {
class _MinePageState extends State<MinePage> { class _MinePageState extends State<MinePage> {
final MineController mineController = Get.put(MineController()); final MineController mineController = Get.put(MineController());
late Future _futureBuilderFuture; late Future _futureBuilderFuture;
EventBus eventBus = EventBus();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_futureBuilderFuture = mineController.queryUserInfo(); _futureBuilderFuture = mineController.queryUserInfo();
eventBus.on(EventName.loginEvent, (args) {
mineController.userLogin.value = args['status']; mineController.userLogin.listen((status) {
if (mounted) { if (mounted) {
setState(() { setState(() {
_futureBuilderFuture = mineController.queryUserInfo(); _futureBuilderFuture = mineController.queryUserInfo();
@ -214,36 +212,6 @@ class _MinePageState extends State<MinePage> {
); );
}, },
), ),
// LayoutBuilder(
// builder: (context, BoxConstraints box) {
// return Container(
// width: box.maxWidth,
// height: 1,
// color: Theme.of(context).colorScheme.onInverseSurface,
// child: Stack(
// children: [
// Positioned(
// top: 0,
// left: 0,
// bottom: 0,
// child: Container(
// width: box.maxWidth *
// (_mineController
// .userInfo.value.levelInfo!.currentExp! /
// _mineController
// .userInfo.value.levelInfo!.nextExp!),
// height: 1,
// decoration: BoxDecoration(
// borderRadius: BorderRadius.circular(4),
// color: Theme.of(context).colorScheme.primary,
// ),
// ),
// ),
// ],
// ),
// );
// },
// ),
], ],
const SizedBox(height: 30), const SizedBox(height: 30),
Padding( Padding(

View File

@ -4,16 +4,13 @@ import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/http/init.dart'; import 'package:pilipala/http/init.dart';
import 'package:pilipala/models/common/theme_type.dart'; import 'package:pilipala/models/common/theme_type.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/mine/controller.dart';
import 'package:pilipala/utils/event_bus.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/login.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
class SettingController extends GetxController { class SettingController extends GetxController {
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
Box setting = GStrorage.setting; Box setting = GStrorage.setting;
// Box userInfoCache = GStrorage.userInfo;
Box localCache = GStrorage.localCache; Box localCache = GStrorage.localCache;
RxBool userLogin = false.obs; RxBool userLogin = false.obs;
@ -59,17 +56,7 @@ class SettingController extends GetxController {
localCache localCache
.put(LocalCacheKey.accessKey, {'mid': -1, 'value': ''}); .put(LocalCacheKey.accessKey, {'mid': -1, 'value': ''});
// 更改我的页面登录状态 await LoginUtils.refreshLoginStatus(false);
await Get.find<MineController>().resetUserInfo();
// 更改主页登录状态
HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(false);
// 事件通知
EventBus eventBus = EventBus();
eventBus.emit(EventName.loginEvent, {'status': false});
SmartDialog.dismiss().then((value) => Get.back()); SmartDialog.dismiss().then((value) => Get.back());
}, },
child: const Text('确认'), child: const Text('确认'),

View File

@ -8,8 +8,10 @@ import 'package:hive/hive.dart';
import 'package:pilipala/http/init.dart'; import 'package:pilipala/http/init.dart';
import 'package:pilipala/http/user.dart'; import 'package:pilipala/http/user.dart';
import 'package:pilipala/pages/home/index.dart'; import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/media/index.dart';
import 'package:pilipala/utils/cookie.dart'; import 'package:pilipala/utils/cookie.dart';
import 'package:pilipala/utils/event_bus.dart'; import 'package:pilipala/utils/event_bus.dart';
import 'package:pilipala/utils/login.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
@ -94,11 +96,12 @@ class WebviewController extends GetxController {
Box userInfoCache = GStrorage.userInfo; Box userInfoCache = GStrorage.userInfo;
await userInfoCache.put('userInfoCache', result['data']); await userInfoCache.put('userInfoCache', result['data']);
// 通知更新
eventBus.emit(EventName.loginEvent, {'status': true});
HomeController homeCtr = Get.find<HomeController>(); HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(true); homeCtr.updateLoginStatus(true);
homeCtr.userFace.value = result['data'].face;
MediaController mediaCtr = Get.find<MediaController>();
mediaCtr.mid = result['data'].mid;
await LoginUtils.refreshLoginStatus(true);
} catch (err) { } catch (err) {
SmartDialog.show(builder: (context) { SmartDialog.show(builder: (context) {
return AlertDialog( return AlertDialog(

30
lib/utils/login.dart Normal file
View File

@ -0,0 +1,30 @@
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:pilipala/pages/dynamics/index.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/media/index.dart';
import 'package:pilipala/pages/mine/index.dart';
class LoginUtils {
static Future refreshLoginStatus(bool status) async {
try {
// 更改我的页面登录状态
await Get.find<MineController>().resetUserInfo();
// 更改主页登录状态
HomeController homeCtr = Get.find<HomeController>();
homeCtr.updateLoginStatus(status);
MineController mineCtr = Get.find<MineController>();
mineCtr.userLogin.value = status;
DynamicsController dynamicsCtr = Get.find<DynamicsController>();
dynamicsCtr.userLogin.value = status;
MediaController mediaCtr = Get.find<MediaController>();
mediaCtr.userLogin.value = status;
} catch (err) {
SmartDialog.showToast('refreshLoginStatus error: ${err.toString()}');
}
}
}