提交 714ac852 authored 作者: yueweilu's avatar yueweilu

1、权限请求类

2、图片权限 3、弹窗组件
上级 ab492862
......@@ -4,5 +4,5 @@ keyPassword=123456
keyAlias=zijing
#storeFile=/Users/apple/zijiing_key.jks
storeFile=zijiing_key.jks
\ No newline at end of file
storeFile=/Users/apple/zijiing_key.jks
#storeFile=zijiing_key.jks
\ No newline at end of file
......@@ -21,7 +21,7 @@ class AdController extends GetxController {
}else {
_timer.cancel();
// context.pushReplacementNamed(Routes.splash);
context.goNamed(Routes.login);
context.goNamed(Routes.main);
}
});
}
......
......@@ -29,7 +29,7 @@ class _SplashPageState extends State<SplashPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
extendBodyBehindAppBar: true,
// extendBodyBehindAppBar: true,
appBar: AppBar(),
body: const Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
......
......@@ -3,6 +3,7 @@ library user_set;
import 'package:flutter/material.dart';
import 'package:flutter_book/theme.dart';
import 'package:flutter_book/utils/index.dart';
import 'package:flutter_book/widgets/index.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:go_router/go_router.dart';
......
......@@ -92,10 +92,12 @@ class _UserSetPageState extends State<UserSetPage> {
onTap: () async{
final result = await AccountAPI.logout();
if (result){
Toast.show('退出成功');
// Toast.show('退出成功');
CustomToast.loading();
await UserStore.to.logout();
CustomToast.dismiss();
if(context.mounted){
context.goNamed(Routes.main);
context.goNamed(Routes.splash);
}
}
},
......
......@@ -37,20 +37,23 @@ class _VersionPageState extends State<VersionPage> {
),
],
),
child: ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: controller.versions.length,
itemBuilder: (BuildContext context, int index){
VersionModel model = controller.versions[index];
return GestureDetector(
child: BuildItem(model: model,),
onTap: (){
context.pushNamed(Routes.versionDes,extra: model);
},
child: ClipRRect(
borderRadius: BorderRadius.circular(8),
child: ListView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: controller.versions.length,
itemBuilder: (BuildContext context, int index){
VersionModel model = controller.versions[index];
return GestureDetector(
child: BuildItem(model: model,),
onTap: (){
context.pushNamed(Routes.versionDes,extra: model);
},
);
}),
);
}),
),
),
),
),
......
......@@ -91,8 +91,8 @@ abstract class Routes {
static final GoRouter config = GoRouter(
// initialLocation: '/$login',
initialLocation: '/',
initialLocation: '/$splash',
// initialLocation: '/',
observers: [observer],
// redirect: _RouteRedirect.auth,
routes: [
......
part of utils;
abstract class Access {
static Future<bool> photos() async {
if (Platform.isIOS) {
final result = await [Permission.photos].request();
return result[Permission.photos] == PermissionStatus.granted ||
result[Permission.photos] == PermissionStatus.limited;
}
if (Platform.isAndroid) {
final result = await [Permission.storage].request();
return result[Permission.storage] == PermissionStatus.granted;
}
return false;
}
static Future<void> setting() async => await openAppSettings();
}
part of utils;
abstract class AssetsPicker {
static final ImagePicker _imagePicker = ImagePicker();
static Future<XFile?> image({
required BuildContext context,
ImageSource source = ImageSource.gallery,
double maxWidth = 512,
double maxHeight = 512,
}) async {
if (!(await Access.photos())) {
if (context.mounted) {
CustomDialog.showAccess(
context: context,
content: const Text('Requires access to your photo gallery'),
);
}
return null;
}
return _imagePicker.pickImage(
source: source,
maxWidth: maxWidth,
maxHeight: maxHeight,
);
}
}
......@@ -7,12 +7,16 @@ import 'dart:ui';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:intl/intl.dart';
import 'package:logger/logger.dart';
import 'package:crypto/crypto.dart';
import 'package:convert/convert.dart';
import 'package:oktoast/oktoast.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
import '../widgets/index.dart';
part 'constants.dart';
......@@ -26,3 +30,5 @@ part 'styles.dart';
part 'validator.dart';
part 'toast_utils.dart';
part 'clear_cache_util.dart';
part 'access.dart';
part 'assets_picker.dart';
\ No newline at end of file
part of widgets;
class CustomDialog extends StatelessWidget {
final Widget child;
final Widget? title;
final Widget? cancel;
final Widget? confirm;
final void Function()? onCancel;
final void Function()? onConfirm;
const CustomDialog({
Key? key,
required this.child,
this.title,
this.cancel,
this.confirm,
this.onCancel,
this.onConfirm,
}) : super(key: key);
static Future<T?> show<T>({
required BuildContext context,
required WidgetBuilder builder,
Widget? title,
Widget? confirm,
Widget? cancel,
void Function()? onConfirm,
void Function()? onCancel,
}) {
return showDialog<T>(
context: context,
barrierColor: const Color(0xFF09101D).withOpacity(0.7),
builder: (context) => CustomDialog(
title: title,
confirm: confirm,
cancel: cancel,
onConfirm: onConfirm,
onCancel: onCancel,
child: builder(context),
),
);
}
static Future<void> showAccess({
required BuildContext context,
required Widget content,
}) async {
await show(
context: context,
builder: (context) => content,
title: const Text('Permission'),
cancel: const Text('Cancel'),
confirm: const Text('Setting'),
onCancel: () => Navigator.of(context).pop(),
onConfirm: () => Access.setting(),
);
}
@override
Widget build(BuildContext context) {
final buttonGroup = <Widget>[];
if (cancel != null) {
buttonGroup.add(Expanded(
child: CustomButton(
type: CustomButtonType.ghost,
shape: CustomButtonShape.stadium,
onPressed: onCancel,
child: cancel!,
),
));
}
if (confirm != null && cancel != null) {
buttonGroup.add(SizedBox(width: 12.w));
}
if (confirm != null) {
buttonGroup.add(Expanded(
child: CustomButton(
shape: CustomButtonShape.stadium,
onPressed: onConfirm,
child: confirm!,
),
));
}
return Dialog(
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (title != null)
Padding(
padding: const EdgeInsets.all(AppTheme.margin),
child: DefaultTextStyle.merge(
textAlign: TextAlign.center,
style: DialogTheme.of(context).titleTextStyle,
child: title!,
),
),
Flexible(
flex: 1,
fit: FlexFit.loose,
child: SingleChildScrollView(
physics: const ClampingScrollPhysics(),
padding: const EdgeInsets.all(AppTheme.margin).copyWith(
top: title != null ? 0 : null,
bottom: buttonGroup.isNotEmpty ? 0 : null,
),
child: DefaultTextStyle.merge(
textAlign: TextAlign.center,
style: DialogTheme.of(context).contentTextStyle?.copyWith(
fontSize: title != null ? 18.w : null,
),
child: Container(
alignment: Alignment.center,
constraints: BoxConstraints(minHeight: 80.h),
child: child,
),
),
),
),
if (buttonGroup.isNotEmpty)
Padding(
padding: const EdgeInsets.all(AppTheme.margin),
child: Row(children: buttonGroup),
),
],
),
);
}
}
......@@ -23,4 +23,5 @@ part 'app_bar.dart';
part 'input.dart';
part 'button.dart';
part 'pull_scroll_view.dart';
part 'tab_bar.dart';
\ No newline at end of file
part 'tab_bar.dart';
part 'dialog.dart';
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论