Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
F
flutter_clx_base
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
openSourceLibrary
flutter_clx_base
Commits
61fe337a
提交
61fe337a
authored
6月 08, 2023
作者:
shixiaochen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1、封装requestPermission工具(动态申请权限);2、封装NormalDialog(通用dialog样式);
上级
858fa749
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
227 行增加
和
0 行删除
+227
-0
AndroidManifest.xml
example/android/app/src/main/AndroidManifest.xml
+4
-0
sample.dart
example/lib/sample.dart
+15
-0
common_utils.dart
lib/utils/common_utils.dart
+44
-0
permission_helper.dart
lib/utils/permission_helper.dart
+63
-0
normal_dialog.dart
lib/widget/normal_dialog.dart
+101
-0
没有找到文件。
example/android/app/src/main/AndroidManifest.xml
浏览文件 @
61fe337a
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
package=
"com.example.example"
>
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<application
android:label=
"example"
android:name=
"${applicationName}"
...
...
example/lib/sample.dart
浏览文件 @
61fe337a
import
'package:flutter/material.dart'
;
import
'package:flutter_clx_base/flutter_clx_base.dart'
;
import
'package:flutter_clx_base/widget/normal_dialog.dart'
;
import
'package:flutter_clx_base_example/sample/base_list_widget_test.dart'
;
import
'package:flutter_clx_base_example/sample/dio_widget_test.dart'
;
import
'package:permission_handler/permission_handler.dart'
;
class
Sample
extends
StatelessWidget
{
const
Sample
({
super
.
key
});
...
...
@@ -19,6 +21,19 @@ class Sample extends StatelessWidget {
fullWidthButton:
true
,
onPressed:
()
=>
Get
.
to
(
const
DioWidgetTest
()),
text:
'dio'
),
GFButton
(
fullWidthButton:
true
,
onPressed:
()
{
Get
.
dialog
(
const
NormalDialog
(
content:
"通用dialog"
));
},
text:
'NormalDialog'
),
GFButton
(
fullWidthButton:
true
,
onPressed:
()
{
// 1、manifest配置权限
requestPermission
(
permissionList:
[
Permission
.
camera
],
toSettingTip:
"请开启相机权限"
);
},
text:
'动态申请权限'
),
],
);
}
...
...
lib/utils/common_utils.dart
浏览文件 @
61fe337a
import
'package:flutter/cupertino.dart'
;
import
'package:flutter_clx_base/utils/log_utils.dart'
;
import
'package:flutter_clx_base/widget/normal_dialog.dart'
;
import
'package:get/get.dart'
;
import
'package:permission_handler/permission_handler.dart'
;
import
'permission_helper.dart'
;
S
?
findOtherLogic
<
S
>({
String
?
tag
})
{
if
(
Get
.
isRegistered
<
S
>(
tag:
tag
))
{
...
...
@@ -72,3 +76,43 @@ String formatInt(number, {nullTxt = "-"}) {
String
formatIntZero
(
number
)
{
return
formatInt
(
number
,
nullTxt:
"0"
);
}
/// 动态申请权限
/// onGranted 获取权限
/// onRefuse 拒绝权限
/// onSettings 手动设置权限
/// onCancelSettings 不手动设置权限
requestPermission
({
VoidCallback
?
onGranted
,
VoidCallback
?
onRefuse
,
VoidCallback
?
onSettings
,
VoidCallback
?
onCancelSettings
,
required
String
?
toSettingTip
,
required
List
<
Permission
>
permissionList
,
})
{
PermissionHelper
.
request
(
permissionList
,
onSuccess:
onGranted
,
// 授权权限回调,
onFailed:
onRefuse
,
// 权限拒绝回调
onOpenSetting:
()
{
Get
.
dialog
(
WillPopScope
(
onWillPop:
()
{
return
Future
.
value
(
false
);
},
child:
NormalDialog
(
title:
"温馨提示"
,
content:
toSettingTip
,
cancelBtnText:
"稍后提醒"
,
confirmBtnText:
"去授权"
,
onConfirm:
()
{
openAppSettings
();
onSettings
?.
call
();
// 跳转设置页面回调
},
onCancel:
onCancelSettings
,
// 不跳转设置页面回调
),
),
barrierDismissible:
false
);
},
);
}
lib/utils/permission_helper.dart
0 → 100644
浏览文件 @
61fe337a
// ignore_for_file: depend_on_referenced_packages
import
'package:flutter/cupertino.dart'
;
import
'package:flutter_clx_base/flutter_clx_base.dart'
;
import
'package:flutter_clx_base/utils/log_utils.dart'
;
import
'package:permission_handler/permission_handler.dart'
;
class
PermissionHelper
{
static
VoidCallback
defaultCall
=
()
{};
///检查权限
// 2023/2/16 权限适配ios
// 2023/2/17 权限适配ios - 已完成
static
void
request
(
List
<
Permission
>
permissionList
,
{
VoidCallback
?
onSuccess
,
VoidCallback
?
onFailed
,
VoidCallback
?
onOpenSetting
,
})
async
{
PermissionStatus
permissionStatus
=
await
_requestPermission
(
permissionList
);
logger
.
d
(
"---PermissionHelper---: permissionStatus=
$permissionStatus
"
);
if
(
permissionStatus
.
isGranted
)
{
// 权限通过
onSuccess
!=
null
?
onSuccess
()
:
defaultCall
();
}
else
if
(
permissionStatus
.
isDenied
)
{
// 权限拒绝
onFailed
!=
null
?
onFailed
()
:
defaultCall
();
}
else
if
(
permissionStatus
.
isPermanentlyDenied
)
{
//权限永久拒绝,且不在提示
onOpenSetting
!=
null
?
onOpenSetting
()
:
defaultCall
();
}
else
if
(
permissionStatus
.
isRestricted
)
{
//IOS单独处理,跳转设置页即可,已支持
onOpenSetting
!=
null
?
onOpenSetting
()
:
defaultCall
();
}
else
if
(
permissionStatus
.
isLimited
)
{
//IOS单独处理,跳转设置页即可,已支持
onOpenSetting
!=
null
?
onOpenSetting
()
:
defaultCall
();
}
}
//申请权限
static
Future
<
PermissionStatus
>
_requestPermission
(
List
<
Permission
>
permissionList
)
async
{
Map
<
Permission
,
PermissionStatus
>
statuses
=
await
permissionList
.
request
();
PermissionStatus
currentPermissionStatus
=
PermissionStatus
.
granted
;
statuses
.
forEach
((
key
,
value
)
{
if
(!
value
.
isGranted
)
{
currentPermissionStatus
=
value
;
return
;
}
});
return
currentPermissionStatus
;
}
//核对权限是否已获取
static
Future
<
bool
>
checkPermission
(
List
<
Permission
>
permissionList
)
async
{
for
(
var
element
in
permissionList
)
{
if
(!
await
element
.
status
.
isGranted
)
{
return
false
;
}
}
return
true
;
}
}
lib/widget/normal_dialog.dart
0 → 100644
浏览文件 @
61fe337a
import
'package:flutter/material.dart'
;
import
'package:flutter_clx_base/flutter_clx_base.dart'
;
/// 通用dialog
class
NormalDialog
extends
StatelessWidget
{
const
NormalDialog
({
super
.
key
,
this
.
onCancel
,
this
.
onConfirm
,
this
.
title
=
'提示'
,
this
.
content
,
this
.
contentWidget
,
this
.
cancelBtnText
=
'取消'
,
this
.
confirmBtnText
=
'确定'
,
});
final
Function
?
onCancel
;
final
Function
?
onConfirm
;
final
String
?
cancelBtnText
;
final
String
confirmBtnText
;
final
String
?
title
;
final
String
?
content
;
final
Widget
?
contentWidget
;
@override
Widget
build
(
BuildContext
context
)
{
return
Dialog
(
shape:
RoundedRectangleBorder
(
borderRadius:
BorderRadius
.
circular
(
8
)),
child:
Column
(
mainAxisSize:
MainAxisSize
.
min
,
children:
[
Column
(
children:
[
Offstage
(
offstage:
title
==
null
,
child:
const
SizedBox
(
height:
10
)),
Text
(
title
??
''
,
style:
const
TextStyle
(
fontSize:
16
,
fontWeight:
FontWeight
.
w500
,
color:
Color
(
0xFF101827
))),
const
SizedBox
(
height:
10
),
contentWidget
==
null
?
Padding
(
padding:
const
EdgeInsets
.
only
(
left:
16
,
right:
16
),
child:
Text
(
content
??
''
,
style:
const
TextStyle
(
fontSize:
14
,
color:
Color
(
0xFF86909C
),
height:
1.5
),
textAlign:
TextAlign
.
center
,
),
)
:
contentWidget
!,
const
SizedBox
(
height:
20.0
),
Container
(
height:
1
,
color:
const
Color
(
0xffE5E6EB
)),
],
),
SizedBox
(
height:
45
,
child:
Row
(
children:
[
cancelBtnText
!=
null
?
Expanded
(
child:
TextButton
(
child:
Text
(
cancelBtnText
??
''
,
style:
const
TextStyle
(
color:
Color
(
0xFF101827
),
fontSize:
16
)),
onPressed:
()
{
Get
.
back
();
onCancel
?.
call
();
},
),
)
:
const
SizedBox
(),
cancelBtnText
!=
null
?
Container
(
width:
1
,
color:
const
Color
(
0xffE5E6EB
),
)
:
const
SizedBox
(),
Expanded
(
child:
TextButton
(
child:
Text
(
confirmBtnText
,
style:
const
TextStyle
(
fontSize:
16
),
),
onPressed:
()
{
Get
.
back
();
onConfirm
?.
call
();
},
),
),
],
),
)
],
),
);
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论