mod: 替换无状态组件

This commit is contained in:
guozhigq
2023-05-27 10:54:36 +08:00
parent c2aeb443a0
commit 0d49f9824c
7 changed files with 101 additions and 138 deletions

View File

@ -2,14 +2,9 @@ import 'package:pilipala/common/constants.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'skeleton.dart'; import 'skeleton.dart';
class VideoCardHSkeleton extends StatefulWidget { class VideoCardHSkeleton extends StatelessWidget {
const VideoCardHSkeleton({super.key}); const VideoCardHSkeleton({super.key});
@override
State<VideoCardHSkeleton> createState() => _VideoCardHSkeletonState();
}
class _VideoCardHSkeletonState extends State<VideoCardHSkeleton> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Skeleton( return Skeleton(

View File

@ -47,12 +47,15 @@ class HomeAppBar extends StatelessWidget {
IconButton( IconButton(
onPressed: () { onPressed: () {
Get.bottomSheet( Get.bottomSheet(
const SizedBox( Builder(builder: (context) {
return const SizedBox(
height: 450, height: 450,
child: MinePage(), child: MinePage(),
), );
clipBehavior: Clip.hardEdge, }),
isScrollControlled: true); clipBehavior: Clip.hardEdge,
isScrollControlled: true,
);
}, },
icon: const Icon(CupertinoIcons.person, size: 22), icon: const Icon(CupertinoIcons.person, size: 22),
), ),

View File

@ -4,29 +4,12 @@ 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';
class MediaPage extends StatefulWidget { class MediaPage extends StatelessWidget {
const MediaPage({super.key}); const MediaPage({super.key});
@override
State<MediaPage> createState() => _MediaPageState();
}
class _MediaPageState extends State<MediaPage>
with AutomaticKeepAliveClientMixin {
final MediaController _mediaController = Get.put(MediaController());
Future? _futureBuilderFuture;
@override
bool get wantKeepAlive => false;
@override
void initState() {
super.initState();
_futureBuilderFuture = _mediaController.queryFavFolder();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final MediaController mediaController = Get.put(MediaController());
Color primary = Theme.of(context).colorScheme.primary; Color primary = Theme.of(context).colorScheme.primary;
return Scaffold( return Scaffold(
appBar: AppBar(toolbarHeight: 30), appBar: AppBar(toolbarHeight: 30),
@ -45,7 +28,7 @@ class _MediaPageState extends State<MediaPage>
), ),
), ),
), ),
for (var i in _mediaController.list) ...[ for (var i in mediaController.list) ...[
ListTile( ListTile(
onTap: () => i['onTap'](), onTap: () => i['onTap'](),
dense: true, dense: true,
@ -65,15 +48,15 @@ class _MediaPageState extends State<MediaPage>
), ),
), ),
], ],
Obx(() => _mediaController.userLogin.value == true Obx(() => mediaController.userLogin.value == true
? favFolder() ? favFolder(mediaController, context)
: const SizedBox()) : const SizedBox())
], ],
), ),
); );
} }
Widget favFolder() { Widget favFolder(mediaController, context) {
return Column( return Column(
children: [ children: [
Divider( Divider(
@ -97,9 +80,9 @@ class _MediaPageState extends State<MediaPage>
Theme.of(context).textTheme.titleMedium!.fontSize, Theme.of(context).textTheme.titleMedium!.fontSize,
fontWeight: FontWeight.bold), fontWeight: FontWeight.bold),
), ),
if (_mediaController.favFolderData.value.count != null) if (mediaController.favFolderData.value.count != null)
TextSpan( TextSpan(
text: _mediaController.favFolderData.value.count text: mediaController.favFolderData.value.count
.toString(), .toString(),
style: TextStyle( style: TextStyle(
fontSize: fontSize:
@ -113,7 +96,7 @@ class _MediaPageState extends State<MediaPage>
), ),
), ),
trailing: IconButton( trailing: IconButton(
onPressed: () => _mediaController.queryFavFolder(), onPressed: () => mediaController.queryFavFolder(),
icon: const Icon( icon: const Icon(
Icons.refresh, Icons.refresh,
size: 20, size: 20,
@ -125,18 +108,18 @@ class _MediaPageState extends State<MediaPage>
width: double.infinity, width: double.infinity,
height: 170, height: 170,
child: FutureBuilder( child: FutureBuilder(
future: _futureBuilderFuture, future: mediaController.queryFavFolder(),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) { if (snapshot.connectionState == ConnectionState.done) {
Map data = snapshot.data; Map data = snapshot.data as Map;
if (data['status']) { if (data['status']) {
List favFolderList = List favFolderList =
_mediaController.favFolderData.value.list!; mediaController.favFolderData.value.list!;
int favFolderCount = int favFolderCount =
_mediaController.favFolderData.value.count!; mediaController.favFolderData.value.count!;
bool flag = favFolderCount > favFolderList.length; bool flag = favFolderCount > favFolderList.length;
return Obx(() => ListView.builder( return Obx(() => ListView.builder(
itemCount: _mediaController itemCount: mediaController
.favFolderData.value.list!.length + .favFolderData.value.list!.length +
(flag ? 1 : 0), (flag ? 1 : 0),
itemBuilder: (context, index) { itemBuilder: (context, index) {
@ -156,7 +139,7 @@ class _MediaPageState extends State<MediaPage>
)); ));
} else { } else {
return FavFolderItem( return FavFolderItem(
item: _mediaController item: mediaController
.favFolderData.value.list![index], .favFolderData.value.list![index],
index: index); index: index);
} }

View File

@ -5,18 +5,13 @@ 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 'controller.dart'; import 'controller.dart';
class MinePage extends StatefulWidget { class MinePage extends StatelessWidget {
const MinePage({super.key}); const MinePage({super.key});
@override
State<MinePage> createState() => _MinePageState();
}
class _MinePageState extends State<MinePage> {
final MineController _mineController = Get.put(MineController());
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final MineController mineController = Get.put(MineController());
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
@ -46,45 +41,39 @@ class _MinePageState extends State<MinePage> {
const SizedBox(width: 10), const SizedBox(width: 10),
], ],
), ),
body: RefreshIndicator( body: LayoutBuilder(
onRefresh: () async { builder: (context, constraint) {
await _mineController.queryUserInfo(); return SingleChildScrollView(
await _mineController.queryUserStatOwner(); physics: const NeverScrollableScrollPhysics(),
}, child: SizedBox(
child: LayoutBuilder( height: constraint.maxHeight,
builder: (context, constraint) { child: Column(
return SingleChildScrollView( children: [
physics: const AlwaysScrollableScrollPhysics(), const SizedBox(height: 10),
child: SizedBox( FutureBuilder(
height: constraint.maxHeight, future: mineController.queryUserInfo(),
child: Column( builder: (context, snapshot) {
children: [ if (snapshot.connectionState == ConnectionState.done) {
const SizedBox(height: 10), if (snapshot.data['status']) {
FutureBuilder( return Obx(() => userInfoBuild(mineController, context));
future: _mineController.queryUserInfo(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.data['status']) {
return Obx(() => userInfoBuild());
} else {
return userInfoBuild();
}
} else { } else {
return userInfoBuild(); return userInfoBuild(mineController, context);
} }
}, } else {
), return userInfoBuild(mineController, context);
], }
), },
),
],
), ),
); ),
}, );
), },
), ),
); );
} }
Widget userInfoBuild() { Widget userInfoBuild(_mineController, context) {
return Column( return Column(
children: [ children: [
const SizedBox(height: 5), const SizedBox(height: 5),

View File

@ -13,6 +13,7 @@ class SettingController extends GetxController {
void onInit() { void onInit() {
super.onInit(); super.onInit();
userLogin.value = user.get(UserBoxKey.userLogin) ?? false; userLogin.value = user.get(UserBoxKey.userLogin) ?? false;
print(userLogin.value);
} }
loginOut() async { loginOut() async {

View File

@ -2,17 +2,11 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/pages/setting/index.dart'; import 'package:pilipala/pages/setting/index.dart';
class SettingPage extends StatefulWidget { class SettingPage extends StatelessWidget {
const SettingPage({super.key}); const SettingPage({super.key});
@override
State<SettingPage> createState() => _SettingPageState();
}
class _SettingPageState extends State<SettingPage> {
final SettingController _settingController = Get.put(SettingController());
@override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final SettingController settingController = Get.put(SettingController());
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('设置'), title: const Text('设置'),
@ -21,9 +15,9 @@ class _SettingPageState extends State<SettingPage> {
children: [ children: [
Obx( Obx(
() => Visibility( () => Visibility(
visible: _settingController.userLogin.value, visible: settingController.userLogin.value,
child: ListTile( child: ListTile(
onTap: () => _settingController.loginOut(), onTap: () => settingController.loginOut(),
dense: false, dense: false,
title: const Text('退出登录'), title: const Text('退出登录'),
), ),

View File

@ -6,60 +6,58 @@ import 'package:pilipala/common/widgets/overlay_pop.dart';
import 'package:pilipala/common/widgets/video_card_h.dart'; import 'package:pilipala/common/widgets/video_card_h.dart';
import './controller.dart'; import './controller.dart';
class RelatedVideoPanel extends StatefulWidget { class RelatedVideoPanel extends GetView<ReleatedController> {
const RelatedVideoPanel({super.key}); const RelatedVideoPanel({super.key});
@override
State<RelatedVideoPanel> createState() => _RelatedVideoPanelState();
}
class _RelatedVideoPanelState extends State<RelatedVideoPanel> {
final ReleatedController _releatedController =
Get.put(ReleatedController(), tag: Get.arguments['heroTag']);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return FutureBuilder( return GetBuilder(
future: _releatedController.queryRelatedVideo(), init: ReleatedController(),
builder: (context, snapshot) { id: Get.arguments['heroTag'],
if (snapshot.connectionState == ConnectionState.done) { builder: (context) {
if (snapshot.data!['status']) { return FutureBuilder(
// 请求成功 future: ReleatedController().queryRelatedVideo(),
return SliverList( builder: (context, snapshot) {
delegate: SliverChildBuilderDelegate((context, index) { if (snapshot.connectionState == ConnectionState.done) {
if (index == snapshot.data['data'].length) { if (snapshot.data!['status']) {
return SizedBox(height: MediaQuery.of(context).padding.bottom); // 请求成功
return SliverList(
delegate: SliverChildBuilderDelegate((context, index) {
if (index == snapshot.data['data'].length) {
return SizedBox(
height: MediaQuery.of(context).padding.bottom);
} else {
return VideoCardH(
videoItem: snapshot.data['data'][index],
longPress: () {
ReleatedController().popupDialog =
_createPopupDialog(snapshot.data['data'][index]);
Overlay.of(context)
.insert(ReleatedController().popupDialog!);
},
longPressEnd: () {
ReleatedController().popupDialog?.remove();
},
);
}
}, childCount: snapshot.data['data'].length + 1));
} else {
// 请求错误
return const Center(
child: Text('出错了'),
);
}
} else { } else {
return VideoCardH( // 骨架屏
videoItem: snapshot.data['data'][index], return SliverList(
longPress: () { delegate: SliverChildBuilderDelegate((context, index) {
_releatedController.popupDialog = return const VideoCardHSkeleton();
_createPopupDialog(snapshot.data['data'][index]); }, childCount: 5),
Overlay.of(context)
.insert(_releatedController.popupDialog!);
},
longPressEnd: () {
_releatedController.popupDialog?.remove();
},
); );
} }
}, childCount: snapshot.data['data'].length + 1)); },
} else {
// 请求错误
return const Center(
child: Text('出错了'),
);
}
} else {
// 骨架屏
return SliverList(
delegate: SliverChildBuilderDelegate((context, index) {
return const VideoCardHSkeleton();
}, childCount: 5),
); );
} });
},
);
} }
OverlayEntry _createPopupDialog(videoItem) { OverlayEntry _createPopupDialog(videoItem) {