915 lines
36 KiB
Dart
915 lines
36 KiB
Dart
import 'package:ef/ef.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:vbvs_app/common/color/appConstants.dart';
|
|
import 'package:vbvs_app/common/util/FitTool.dart';
|
|
import 'package:vbvs_app/common/util/MyUtils.dart';
|
|
import 'package:vbvs_app/component/tool/TopSlideNotification.dart';
|
|
import 'package:vbvs_app/controller/theme_controller/ThemeController.dart';
|
|
|
|
getOnePicker(context, List arr, int checkIndex, Function onSelectedItemChanged,
|
|
{bool looping = false}) {
|
|
ThemeController themeController = Get.find();
|
|
return CupertinoPicker(
|
|
key: UniqueKey(),
|
|
useMagnifier: false,
|
|
itemExtent: 80.rpx,
|
|
magnification: 1,
|
|
diameterRatio: 3,
|
|
squeeze: 1,
|
|
looping: looping,
|
|
scrollController: FixedExtentScrollController(initialItem: checkIndex),
|
|
selectionOverlay: Container(),
|
|
onSelectedItemChanged: (int value) {
|
|
// print("$value");
|
|
onSelectedItemChanged.call(value);
|
|
},
|
|
children: [
|
|
...List.generate(arr.length, (index) {
|
|
return Container(
|
|
alignment: Alignment.center,
|
|
width: 400.rpx,
|
|
decoration: BoxDecoration(
|
|
border: Border(
|
|
bottom: index != arr.length
|
|
? BorderSide(
|
|
color: stringToColor("#8D95B0"),
|
|
)
|
|
: BorderSide.none,
|
|
),
|
|
),
|
|
child: Text("${arr[index]}",
|
|
style: FlutterFlowTheme.of(context).bodyMedium.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx)),
|
|
);
|
|
})
|
|
],
|
|
);
|
|
}
|
|
|
|
Future showDateSelectionDialog(BuildContext context,
|
|
{required DateTime checkDate,
|
|
Function? checkChange,
|
|
String title = "选择生日"}) {
|
|
ThemeController themeController = Get.find();
|
|
Color checkColor = stringToColor("#D3B684");
|
|
List years = [], months = [], days = [];
|
|
var days_select = [].obs;
|
|
int day_len = 31;
|
|
int year = DateTime.now().year;
|
|
for (var i = 0; i < 100; i++) {
|
|
years.insert(0, year - i);
|
|
}
|
|
for (var i = 1; i < 13; i++) {
|
|
months.add(i);
|
|
}
|
|
for (var i = 1; i < 32; i++) {
|
|
days.add(i);
|
|
}
|
|
int yearIndex = years.lastIndexOf(checkDate.year);
|
|
int monthIndex = months.lastIndexOf(checkDate.month);
|
|
day_len = DateTime.fromMillisecondsSinceEpoch(
|
|
DateTime(years[yearIndex], months[monthIndex] + 1)
|
|
.millisecondsSinceEpoch -
|
|
1000)
|
|
.day;
|
|
days_select.value = days.sublist(0, day_len);
|
|
int dayIndex = days.lastIndexOf(checkDate.day);
|
|
return showDialog(
|
|
// barrierColor: stringToColor("#000320"),
|
|
context: context,
|
|
barrierDismissible: true, // 点击对话框外部可关闭
|
|
builder: (BuildContext context) {
|
|
return Stack(
|
|
children: [
|
|
Positioned(
|
|
bottom: 0, // 控制弹窗距离顶部的位置
|
|
left: 0,
|
|
right: 0,
|
|
child: Material(
|
|
color: Colors.transparent,
|
|
child: Dialog(
|
|
backgroundColor: stringToColor("#182B7C"),
|
|
insetPadding: EdgeInsets.zero,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(0),
|
|
),
|
|
child: Container(
|
|
width: double.infinity,
|
|
padding: EdgeInsets.fromLTRB(30.rpx, 10.rpx, 30.rpx, 90.rpx),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: <Widget>[
|
|
Container(
|
|
alignment: Alignment.centerLeft,
|
|
height: 60.rpx,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
"$title",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
closeIconWhite
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
height: 240.rpx,
|
|
margin: EdgeInsets.only(top: 60.rpx, bottom: 60.rpx),
|
|
padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx),
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: Container(
|
|
padding: EdgeInsets.only(
|
|
left: 40.rpx, right: 30.rpx),
|
|
child: getOnePicker(context, years, yearIndex,
|
|
(d) {
|
|
yearIndex = d;
|
|
dayIndex = 0;
|
|
day_len = DateTime.fromMillisecondsSinceEpoch(
|
|
DateTime(years[yearIndex],
|
|
months[monthIndex] + 1)
|
|
.millisecondsSinceEpoch -
|
|
1000)
|
|
.day;
|
|
days_select.value = days.sublist(0, day_len);
|
|
}),
|
|
),
|
|
),
|
|
Container(
|
|
child: Text(
|
|
"年",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Container(
|
|
padding: EdgeInsets.only(
|
|
left: 30.rpx, right: 30.rpx),
|
|
child: getOnePicker(context, months, monthIndex,
|
|
(d) {
|
|
monthIndex = d;
|
|
dayIndex = 0;
|
|
day_len = DateTime.fromMillisecondsSinceEpoch(
|
|
DateTime(years[yearIndex],
|
|
months[monthIndex] + 1)
|
|
.millisecondsSinceEpoch -
|
|
1000)
|
|
.day;
|
|
days_select.value = days.sublist(0, day_len);
|
|
}),
|
|
),
|
|
),
|
|
Container(
|
|
child: Text(
|
|
"月",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Container(
|
|
padding: EdgeInsets.only(
|
|
left: 30.rpx, right: 40.rpx),
|
|
child: Obx(
|
|
() {
|
|
// print("${dayIndex} ${day_len}");
|
|
return getOnePicker(
|
|
context,
|
|
days_select,
|
|
dayIndex,
|
|
(d) {
|
|
dayIndex = d;
|
|
},
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
Container(
|
|
child: Text(
|
|
"日",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
InkWell(
|
|
onTap: () {
|
|
checkChange?.call(DateTime(years[yearIndex],
|
|
months[monthIndex], days[dayIndex]));
|
|
Get.back();
|
|
},
|
|
child: Container(
|
|
height: 68.rpx,
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(
|
|
color: stringToColor("#D3B684"),
|
|
borderRadius: BorderRadius.circular(10.rpx),
|
|
),
|
|
child: Text(
|
|
"确定",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
Future showDayTimeSelectionDialog(BuildContext context,
|
|
{required List<int> dayTimeArr, Function? checkChange, String title = ""}) {
|
|
ThemeController themeController = Get.find();
|
|
Color checkColor = stringToColor("#D3B684");
|
|
List hours = [], minutes = [];
|
|
for (var i = 0; i < 24; i++) {
|
|
hours.add(i);
|
|
}
|
|
for (var i = 0; i < 60; i++) {
|
|
minutes.add(i);
|
|
}
|
|
int hoursIndex = hours.lastIndexOf(dayTimeArr[0]);
|
|
int minutesIndex = minutes.lastIndexOf(dayTimeArr[1]);
|
|
return showDialog(
|
|
// barrierColor: stringToColor("#000320"),
|
|
context: context,
|
|
barrierDismissible: true, // 点击对话框外部可关闭
|
|
builder: (BuildContext context) {
|
|
return Stack(
|
|
children: [
|
|
Positioned(
|
|
bottom: 0, // 控制弹窗距离顶部的位置
|
|
left: 0,
|
|
right: 0,
|
|
child: Material(
|
|
color: Colors.transparent,
|
|
child: Dialog(
|
|
backgroundColor: stringToColor("#182B7C"),
|
|
insetPadding: EdgeInsets.zero,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(0),
|
|
),
|
|
child: Container(
|
|
width: double.infinity,
|
|
padding: EdgeInsets.fromLTRB(30.rpx, 10.rpx, 30.rpx, 90.rpx),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: <Widget>[
|
|
Container(
|
|
alignment: Alignment.centerLeft,
|
|
height: 60.rpx,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
"$title",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
closeIconWhite
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
height: 240.rpx,
|
|
margin: EdgeInsets.only(top: 60.rpx, bottom: 60.rpx),
|
|
padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx),
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: Container(
|
|
padding: EdgeInsets.only(
|
|
left: 40.rpx, right: 30.rpx),
|
|
child: getOnePicker(context, hours, hoursIndex,
|
|
(d) {
|
|
hoursIndex = d;
|
|
}),
|
|
),
|
|
),
|
|
Container(
|
|
child: Text(
|
|
"时",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: Container(
|
|
padding: EdgeInsets.only(
|
|
left: 30.rpx, right: 30.rpx),
|
|
child: getOnePicker(
|
|
context, minutes, minutesIndex, (d) {
|
|
minutesIndex = d;
|
|
}),
|
|
),
|
|
),
|
|
Container(
|
|
child: Text(
|
|
"分",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
InkWell(
|
|
onTap: () {
|
|
checkChange?.call(
|
|
[hours[hoursIndex], minutes[minutesIndex]]);
|
|
Get.back();
|
|
},
|
|
child: Container(
|
|
height: 68.rpx,
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(
|
|
color: stringToColor("#D3B684"),
|
|
borderRadius: BorderRadius.circular(10.rpx),
|
|
),
|
|
child: Text(
|
|
"确定",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
Future showOneSelectionDialog(BuildContext context,
|
|
{required List arr,
|
|
int checkIndex = 0,
|
|
Function? checkChange,
|
|
String title = "选择性别"}) {
|
|
ThemeController themeController = Get.find();
|
|
Color checkColor = stringToColor("#D3B684");
|
|
return showDialog(
|
|
// barrierColor: stringToColor("#000320"),
|
|
context: context,
|
|
barrierDismissible: true, // 点击对话框外部可关闭
|
|
builder: (BuildContext context) {
|
|
return Stack(
|
|
children: [
|
|
Positioned(
|
|
bottom: 0, // 控制弹窗距离顶部的位置
|
|
left: 0,
|
|
right: 0,
|
|
child: Material(
|
|
color: Colors.transparent,
|
|
child: Dialog(
|
|
backgroundColor: stringToColor("#182B7C"),
|
|
insetPadding: EdgeInsets.zero,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(0),
|
|
),
|
|
child: Container(
|
|
width: double.infinity,
|
|
padding: EdgeInsets.fromLTRB(30.rpx, 10.rpx, 30.rpx, 90.rpx),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: <Widget>[
|
|
Container(
|
|
alignment: Alignment.centerLeft,
|
|
height: 60.rpx,
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Text(
|
|
"$title",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
closeIconWhite
|
|
],
|
|
),
|
|
),
|
|
Container(
|
|
height: 240.rpx,
|
|
alignment: Alignment.center,
|
|
margin: EdgeInsets.only(top: 60.rpx, bottom: 60.rpx),
|
|
padding: EdgeInsets.only(left: 30.rpx, right: 30.rpx),
|
|
child: Container(
|
|
width: 400.rpx,
|
|
child:
|
|
getOnePicker(context, arr, checkIndex, (index) {
|
|
checkIndex = index;
|
|
}),
|
|
)),
|
|
InkWell(
|
|
onTap: () {
|
|
checkChange?.call(checkIndex);
|
|
Get.back();
|
|
},
|
|
child: Container(
|
|
height: 68.rpx,
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(
|
|
color: stringToColor("#D3B684"),
|
|
borderRadius: BorderRadius.circular(10.rpx),
|
|
),
|
|
child: Text(
|
|
"确定",
|
|
style: FlutterFlowTheme.of(context)
|
|
.bodyMedium
|
|
.override(
|
|
fontFamily: 'Readex Pro',
|
|
color: themeController.currentColor.sc3,
|
|
letterSpacing: 0,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
enum ConfirmDialogIcon {
|
|
none,
|
|
danger,
|
|
success,
|
|
warn;
|
|
|
|
get uname {
|
|
String v = "";
|
|
switch (this) {
|
|
case ConfirmDialogIcon.danger:
|
|
v = "danger";
|
|
break;
|
|
case ConfirmDialogIcon.success:
|
|
v = "success";
|
|
break;
|
|
case ConfirmDialogIcon.warn:
|
|
v = "warn";
|
|
break;
|
|
case ConfirmDialogIcon.none:
|
|
v = "";
|
|
break;
|
|
}
|
|
return v;
|
|
}
|
|
}
|
|
|
|
Future showCustomConfirmDialog(BuildContext context, String name,
|
|
{String btnName = "确定",
|
|
ConfirmDialogIcon icon = ConfirmDialogIcon.warn}) async {
|
|
ThemeController themeController = Get.find();
|
|
return showDialog(
|
|
context: context,
|
|
barrierDismissible: true,
|
|
builder: (BuildContext context) {
|
|
return Dialog(
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
child: Container(
|
|
width: 660.rpx,
|
|
padding: EdgeInsets.fromLTRB(16, 0, 16, 16),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
Container(
|
|
alignment: Alignment.centerRight,
|
|
child: closeIcon,
|
|
),
|
|
SizedBox(height: 60.rpx),
|
|
if ("${icon.uname}".isNotEmpty)
|
|
Center(
|
|
child: Container(
|
|
margin: EdgeInsets.only(bottom: 39.rpx),
|
|
width: 50.rpx,
|
|
height: 50.rpx,
|
|
child: Image.asset("assets/images/toast/${icon.uname}.png"),
|
|
),
|
|
),
|
|
Center(
|
|
child: Text(
|
|
'${name}',
|
|
style: TextStyle(fontSize: 16),
|
|
),
|
|
),
|
|
SizedBox(height: 20.rpx),
|
|
Container(
|
|
margin: EdgeInsets.only(top: 50.rpx, bottom: 40.rpx),
|
|
alignment: Alignment.center,
|
|
child: InkWell(
|
|
onTap: () {
|
|
Get.back(result: "confirm");
|
|
},
|
|
child: Container(
|
|
width: 260.rpx,
|
|
height: 60.rpx,
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(6),
|
|
color: stringToColor("#D3B684")),
|
|
child: Text(
|
|
'$btnName',
|
|
style: TextStyle(
|
|
color: themeController.currentColor.sc3,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
Future showCustomConfirmAndCancelDialog(BuildContext context, String name,
|
|
{String confirmName = "确定",
|
|
String cancelName = "取消",
|
|
ConfirmDialogIcon icon = ConfirmDialogIcon.warn}) async {
|
|
ThemeController themeController = Get.find();
|
|
return showDialog(
|
|
context: context,
|
|
barrierDismissible: true,
|
|
builder: (BuildContext context) {
|
|
return Dialog(
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
child: Container(
|
|
width: 660.rpx,
|
|
padding: EdgeInsets.fromLTRB(16, 0, 16, 16),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
Container(
|
|
alignment: Alignment.centerRight,
|
|
child: closeIcon,
|
|
),
|
|
SizedBox(height: 40.rpx),
|
|
if ("${icon.uname}".isNotEmpty)
|
|
Center(
|
|
child: Container(
|
|
margin: EdgeInsets.only(bottom: 39.rpx),
|
|
width: 50.rpx,
|
|
height: 50.rpx,
|
|
child: Image.asset("assets/images/toast/${icon.uname}.png"),
|
|
),
|
|
),
|
|
Center(
|
|
child: Text(
|
|
'${name}',
|
|
style: TextStyle(fontSize: 16),
|
|
),
|
|
),
|
|
SizedBox(height: 20.rpx),
|
|
Container(
|
|
margin: EdgeInsets.only(top: 50.rpx, bottom: 40.rpx),
|
|
alignment: Alignment.center,
|
|
child: InkWell(
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
InkWell(
|
|
onTap: () {
|
|
Get.back(result: "cancel");
|
|
},
|
|
child: Container(
|
|
width: 200.rpx,
|
|
height: 60.rpx,
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(6),
|
|
border: Border.all(color: Colors.black12)),
|
|
child: Text(
|
|
'$cancelName',
|
|
style:
|
|
TextStyle(color: Colors.black, fontSize: 30.rpx),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
width: 80.rpx,
|
|
),
|
|
InkWell(
|
|
onTap: () {
|
|
Get.back(result: "confirm");
|
|
},
|
|
child: Container(
|
|
width: 200.rpx,
|
|
height: 60.rpx,
|
|
alignment: Alignment.center,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(6),
|
|
color: stringToColor("#D3B684")),
|
|
child: Text(
|
|
'$confirmName',
|
|
style: TextStyle(
|
|
color: themeController.currentColor.sc3,
|
|
fontSize: 30.rpx),
|
|
),
|
|
),
|
|
)
|
|
],
|
|
)),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
//权限说明弹窗
|
|
void showPermissionInfoDialog(BuildContext context, List data) {
|
|
ThemeController themeController = Get.find();
|
|
showDialog(
|
|
context: context,
|
|
barrierDismissible: false, // 点击对话框外部可关闭
|
|
builder: (BuildContext context) {
|
|
return Stack(
|
|
children: [
|
|
Positioned(
|
|
top: 30.rpx, // 控制弹窗距离顶部的位置
|
|
left: 0,
|
|
right: 0,
|
|
child: Material(
|
|
color: Colors.transparent,
|
|
child: Dialog(
|
|
backgroundColor: themeController.currentColor.sc3,
|
|
insetPadding: EdgeInsets.fromLTRB(0, 0, 0, 0),
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
child: Container(
|
|
constraints: BoxConstraints(maxHeight: 500.rpx),
|
|
padding: EdgeInsets.all(16),
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(10),
|
|
),
|
|
child: SingleChildScrollView(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: <Widget>[
|
|
...List.generate(data.length, (index) {
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
"${data[index][0]}",
|
|
style: TextStyle(
|
|
fontSize: 30.rpx,
|
|
color: stringToColor("#333333"),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 4.rpx,
|
|
),
|
|
Text(
|
|
"${data[index][1]}",
|
|
style: TextStyle(
|
|
fontSize: 26.rpx,
|
|
color: stringToColor("#A4AABC"),
|
|
),
|
|
),
|
|
if (index != data.length - 1)
|
|
SizedBox(
|
|
height: 18.rpx,
|
|
),
|
|
],
|
|
);
|
|
}),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
void showProgressDialog(
|
|
BuildContext context,
|
|
ValueNotifier<double> progressNotifier,
|
|
ValueNotifier<bool> failureNotifier,
|
|
) {
|
|
ThemeController themeController = Get.find();
|
|
|
|
showDialog(
|
|
context: context,
|
|
barrierDismissible: false, // 点击对话框外部不可关闭
|
|
builder: (BuildContext dialogContext) {
|
|
return Stack(
|
|
children: [
|
|
Positioned(
|
|
top: MediaQuery.of(context).size.height * 0.4,
|
|
left: MediaQuery.of(context).size.width * 0.05,
|
|
right: MediaQuery.of(context).size.width * 0.05,
|
|
child: Material(
|
|
color: Colors.transparent,
|
|
child: Dialog(
|
|
backgroundColor: Colors.transparent,
|
|
insetPadding: EdgeInsets.zero,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(10.0),
|
|
),
|
|
child: Container(
|
|
padding: EdgeInsets.all(16),
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.circular(10),
|
|
),
|
|
child: ValueListenableBuilder<double>(
|
|
valueListenable: progressNotifier,
|
|
builder: (context, progress, _) {
|
|
return ValueListenableBuilder<bool>(
|
|
valueListenable: failureNotifier,
|
|
builder: (context, isFailure, __) {
|
|
// 关闭弹窗的逻辑
|
|
if (isFailure) {
|
|
// 延迟关闭弹窗和提示错误
|
|
Future.delayed(Duration(milliseconds: 300), () {
|
|
if (Navigator.canPop(dialogContext)) {
|
|
Navigator.of(dialogContext).pop();
|
|
}
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "设备校准失败".tr,
|
|
textColor: Colors.red,
|
|
);
|
|
});
|
|
} else if (progress >= 1.0) {
|
|
// 延迟关闭弹窗和提示成功(可选)
|
|
Future.delayed(Duration(milliseconds: 300), () {
|
|
if (Navigator.canPop(dialogContext)) {
|
|
Navigator.of(dialogContext).pop();
|
|
}
|
|
TopSlideNotification.show(
|
|
context,
|
|
text: "设备校准完成".tr,
|
|
textColor: themeController.currentColor.sc3,
|
|
);
|
|
});
|
|
}
|
|
|
|
return Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: <Widget>[
|
|
Text(
|
|
isFailure
|
|
? '失败'.tr
|
|
: '${(progress * 100).toStringAsFixed(0)}%',
|
|
style: TextStyle(
|
|
fontSize: 26.rpx,
|
|
color: isFailure
|
|
? Colors.red
|
|
: themeController.currentColor.sc3,
|
|
),
|
|
),
|
|
SizedBox(height: 40.rpx),
|
|
Stack(
|
|
children: [
|
|
Container(
|
|
width: double.infinity,
|
|
height: 21.rpx,
|
|
decoration: BoxDecoration(
|
|
color: stringToColor("#D9D9D9"),
|
|
borderRadius: BorderRadius.circular(
|
|
AppConstants().button_container_radius,
|
|
),
|
|
),
|
|
),
|
|
Container(
|
|
width: progress *
|
|
MediaQuery.of(context).size.width *
|
|
0.8,
|
|
height: 10.rpx,
|
|
decoration: BoxDecoration(
|
|
gradient: LinearGradient(
|
|
colors: isFailure
|
|
? [themeController.currentColor.sc9]
|
|
: [
|
|
themeController
|
|
.currentColor.sc1,
|
|
themeController
|
|
.currentColor.sc2,
|
|
],
|
|
begin: Alignment.centerLeft,
|
|
end: Alignment.centerRight,
|
|
),
|
|
borderRadius:
|
|
BorderRadius.circular(5.rpx),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
},
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|