mod: 异常状态样式

This commit is contained in:
guozhigq
2023-08-19 17:50:26 +08:00
parent 740116e873
commit ec9d9739fe
12 changed files with 134 additions and 32 deletions

1
assets/images/error.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,31 +1,41 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class HttpError extends StatelessWidget { class HttpError extends StatelessWidget {
const HttpError({required this.errMsg, required this.fn, super.key}); const HttpError(
{required this.errMsg, required this.fn, this.btnText, super.key});
final String? errMsg; final String? errMsg;
final Function()? fn; final Function()? fn;
final String? btnText;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SliverToBoxAdapter( return SliverToBoxAdapter(
child: SizedBox( child: SizedBox(
height: 150, height: 400,
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
SvgPicture.asset(
"assets/images/error.svg",
height: 200,
),
const SizedBox(height: 20),
Text( Text(
errMsg ?? '请求异常', errMsg ?? '请求异常',
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleMedium, style: Theme.of(context).textTheme.titleSmall,
), ),
const SizedBox(height: 10), const SizedBox(height: 30),
ElevatedButton( OutlinedButton.icon(
onPressed: () { onPressed: () {
fn!(); fn!();
}, },
child: const Text('点击重试')) icon: const Icon(Icons.arrow_forward_outlined, size: 20),
label: Text(btnText ?? '点击重试'),
)
], ],
), ),
), ),

View File

@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class NoData extends StatelessWidget {
const NoData({super.key});
@override
Widget build(BuildContext context) {
return SliverToBoxAdapter(
child: SizedBox(
height: 400,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
"assets/images/error.svg",
height: 200,
),
const SizedBox(height: 20),
Text(
'没有数据',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.titleSmall,
),
],
),
),
);
}
}

View File

@ -55,7 +55,7 @@ class VideoCardH extends StatelessWidget {
}, },
child: Padding( child: Padding(
padding: const EdgeInsets.fromLTRB( padding: const EdgeInsets.fromLTRB(
StyleString.safeSpace, 7, StyleString.safeSpace, 7), StyleString.safeSpace, 5, StyleString.safeSpace, 5),
child: LayoutBuilder( child: LayoutBuilder(
builder: (context, boxConstraints) { builder: (context, boxConstraints) {
double width = double width =

View File

@ -62,7 +62,7 @@ class DynamicsController extends GetxController {
Future queryFollowDynamic({type = 'init'}) async { Future queryFollowDynamic({type = 'init'}) async {
if (!userLogin.value) { if (!userLogin.value) {
return {'status': false, 'msg': '未登录'}; return {'status': false, 'msg': '账号未登录'};
} }
if (type == 'init') { if (type == 'init') {
dynamicsList.clear(); dynamicsList.clear();
@ -188,6 +188,9 @@ class DynamicsController extends GetxController {
} }
Future queryFollowUp({type = 'init'}) async { Future queryFollowUp({type = 'init'}) async {
if (!userLogin.value) {
return {'status': false, 'msg': '账号未登录'};
}
if (type == 'init') { if (type == 'init') {
upData = FollowUpModel().obs; upData = FollowUpModel().obs;
} }

View File

@ -9,9 +9,10 @@ import 'package:pilipala/utils/storage.dart';
class HistoryController extends GetxController { class HistoryController extends GetxController {
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
RxList<HisListItem> historyList = [HisListItem()].obs; RxList<HisListItem> historyList = [HisListItem()].obs;
bool isLoadingMore = false; RxBool isLoadingMore = false.obs;
RxBool pauseStatus = false.obs; RxBool pauseStatus = false.obs;
Box localCache = GStrorage.localCache; Box localCache = GStrorage.localCache;
RxBool isLoading = false.obs;
@override @override
void onInit() { void onInit() {
@ -26,9 +27,9 @@ class HistoryController extends GetxController {
max = historyList.last.history!.oid!; max = historyList.last.history!.oid!;
viewAt = historyList.last.viewAt!; viewAt = historyList.last.viewAt!;
} }
isLoadingMore = true; isLoadingMore.value = true;
var res = await UserHttp.historyList(max, viewAt); var res = await UserHttp.historyList(max, viewAt);
isLoadingMore = false; isLoadingMore.value = false;
if (res['status']) { if (res['status']) {
if (type == 'onload') { if (type == 'onload') {
historyList.addAll(res['data'].list); historyList.addAll(res['data'].list);

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/skeleton/video_card_h.dart'; import 'package:pilipala/common/skeleton/video_card_h.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/pages/history/index.dart'; import 'package:pilipala/pages/history/index.dart';
import 'widgets/item.dart'; import 'widgets/item.dart';
@ -27,7 +28,7 @@ class _HistoryPageState extends State<HistoryPage> {
if (_historyController.scrollController.position.pixels >= if (_historyController.scrollController.position.pixels >=
_historyController.scrollController.position.maxScrollExtent - _historyController.scrollController.position.maxScrollExtent -
300) { 300) {
if (!_historyController.isLoadingMore) { if (!_historyController.isLoadingMore.value) {
_historyController.onLoad(); _historyController.onLoad();
} }
} }
@ -92,13 +93,9 @@ class _HistoryPageState extends State<HistoryPage> {
Map data = snapshot.data; Map data = snapshot.data;
if (data['status']) { if (data['status']) {
return Obx( return Obx(
() => _historyController.historyList.isEmpty () => _historyController.historyList.isNotEmpty &&
? const SliverToBoxAdapter( !_historyController.isLoadingMore.value
child: Center( ? SliverList(
child: Text('没数据'),
),
)
: SliverList(
delegate: SliverChildBuilderDelegate( delegate: SliverChildBuilderDelegate(
(context, index) { (context, index) {
return HistoryItem( return HistoryItem(
@ -108,7 +105,12 @@ class _HistoryPageState extends State<HistoryPage> {
}, },
childCount: childCount:
_historyController.historyList.length), _historyController.historyList.length),
), )
: _historyController.isLoadingMore.value
? const SliverToBoxAdapter(
child: Center(child: Text('加载中')),
)
: const NoData(),
); );
} else { } else {
return HttpError( return HttpError(

View File

@ -116,7 +116,7 @@ class HistoryItem extends StatelessWidget {
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.fromLTRB( padding: const EdgeInsets.fromLTRB(
StyleString.cardSpace, 5, StyleString.cardSpace, 5), StyleString.safeSpace, 5, StyleString.safeSpace, 5),
child: LayoutBuilder( child: LayoutBuilder(
builder: (context, boxConstraints) { builder: (context, boxConstraints) {
double width = double width =

View File

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/skeleton/video_card_h.dart'; import 'package:pilipala/common/skeleton/video_card_h.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/common/widgets/video_card_h.dart'; import 'package:pilipala/common/widgets/video_card_h.dart';
import 'package:pilipala/pages/later/index.dart'; import 'package:pilipala/pages/later/index.dart';
@ -85,13 +86,11 @@ class _LaterPageState extends State<LaterPage> {
); );
}, childCount: _laterController.laterList.length), }, childCount: _laterController.laterList.length),
) )
: SliverToBoxAdapter( : _laterController.isLoading.value
child: Center( ? const SliverToBoxAdapter(
child: Text(_laterController.isLoading.value child: Center(child: Text('加载中')),
? '加载中' )
: '没有数据'), : const NoData(),
),
),
); );
} else { } else {
return HttpError( return HttpError(

View File

@ -161,11 +161,25 @@ class _MediaPageState extends State<MediaPage>
right: 14, bottom: 35), right: 14, bottom: 35),
child: Center( child: Center(
child: IconButton( child: IconButton(
style: ButtonStyle(
padding: MaterialStateProperty.all(
EdgeInsets.zero),
backgroundColor:
MaterialStateProperty.resolveWith(
(states) {
return Theme.of(context)
.colorScheme
.primaryContainer
.withOpacity(0.5);
}),
),
onPressed: () => Get.toNamed('/fav'), onPressed: () => Get.toNamed('/fav'),
icon: Icon( icon: Icon(
Icons.arrow_forward_ios, Icons.arrow_forward_ios,
size: 18, size: 18,
color: Theme.of(context).primaryColor, color: Theme.of(context)
.colorScheme
.primary,
), ),
), ),
)); ));

View File

@ -467,6 +467,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.9.3+2" version: "4.9.3+2"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
sha256: "8c5d68a82add3ca76d792f058b186a0599414f279f00ece4830b9b231b570338"
url: "https://pub.dev"
source: hosted
version: "2.0.7"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -813,6 +821,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.3" version: "1.8.3"
path_parsing:
dependency: transitive
description:
name: path_parsing
sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf
url: "https://pub.dev"
source: hosted
version: "1.0.1"
path_provider: path_provider:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1274,6 +1290,30 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.7" version: "3.0.7"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "670f6e07aca990b4a2bcdc08a784193c4ccdd1932620244c3a86bb72a0eac67f"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: "7451721781d967db9933b63f5733b1c4533022c0ba373a01bdd79d1a5457f69f"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "80a13c613c8bde758b1464a1755a7b3a8f2b6cec61fbf0f5a53c94c30f03ba2e"
url: "https://pub.dev"
source: hosted
version: "1.1.7"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:

View File

@ -112,6 +112,7 @@ dependencies:
# 获取appx信息 # 获取appx信息
package_info_plus: ^4.1.0 package_info_plus: ^4.1.0
url_launcher: ^6.1.12 url_launcher: ^6.1.12
flutter_svg: ^2.0.7
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: