This commit is contained in:
dzc committed 2025-03-14 15:05:06 +08:00
1 parent aa39211aba
commit 76f97a2e7a
23 files changed
+226 -294

No files matched your search

-1
View File
@@ -61,7 +61,6 @@ flutter {
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/AIKit.aar')
// rxjava
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
Binary file not shown.
+4 -4
View File
@@ -22,8 +22,8 @@
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:label="智慧食堂"
android:requestLegacyExternalStorage="true"
android:requestRawExternalStorageAccess="true">
android:largeHeap="true"
android:requestLegacyExternalStorage="true">
<activity
android:name=".MainActivity"
@@ -42,9 +42,9 @@
<activity
android:name="io.flutter.plugins.facediscern.ui.FaceDiscern"
android:exported="false"
android:hardwareAccelerated="true"
android:hardwareAccelerated="false"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.NoActionBar" />
android:theme="@style/Theme.AppCompat.NoActionBar" />
<meta-data
android:name="flutterEmbedding"
@@ -13,7 +13,7 @@ import java.io.File;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String TAG = "DatabaseHelper";
private static final String DATABASE_PATH = "pj/database";
private static final String DATABASE_PATH = "pj_cashier/database";
private static final String DATABASE_NAME = "cash_register.db";
private static final int DATABASE_VERSION = 1;
@@ -5,6 +5,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.NonNull;
@@ -74,10 +76,15 @@ public class FlutterFaceDiscernPlugin implements FlutterPlugin, MethodChannel.Me
switch (method) {
case "jumpFaceDiscern":
try {
// Intent intent = new Intent(context, FaceDiscern.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
// context.startActivity(intent);
Intent intent = new Intent(context, FaceDiscern.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
context.startActivity(intent);
new Handler(Looper.getMainLooper()).post(() -> context.startActivity(intent));
result.success(true);
} catch (Exception e) {
result.success(false);
@@ -4,7 +4,10 @@ import android.Manifest;
import android.content.Intent;
import android.graphics.Point;
import android.hardware.Camera;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.ViewGroup;
@@ -15,10 +18,12 @@ import androidx.core.app.ActivityCompat;
import androidx.databinding.DataBindingUtil;
import androidx.lifecycle.ViewModelProvider;
import com.example.pj_supermarket_cloud.MainActivity;
import com.example.pj_supermarket_cloud.R;
import com.example.pj_supermarket_cloud.databinding.ActivityFaceDiscernBinding;
import io.flutter.Log;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugins.facediscern.flutter.FlutterFaceDiscernPlugin;
import io.flutter.plugins.facediscern.tool.camera.DualCameraHelper;
import io.flutter.plugins.facediscern.tool.camera.callback.CameraListener;
@@ -40,10 +45,7 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
private static final String TAG = "人脸识别页面";
private static final String[] NEEDED_PERMISSIONS = new String[]{
Manifest.permission.CAMERA,
Manifest.permission.READ_PHONE_STATE
};
private static final String[] NEEDED_PERMISSIONS = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE};
private FaceRectTransformer rgbFaceRectTransformer;
@@ -131,13 +133,10 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
if (Objects.nonNull(channel)) {
channel.invokeMethod("faceDiscernPageInit", null);
}
if (rgbCameraHelper != null) {
rgbCameraHelper.resumePreview();
}
scheduler.schedule(() -> {
try {
if (viewModel != null) {
viewModel.stop();
if (rgbCameraHelper != null) {
rgbCameraHelper.resumePreview();
previewLock = false;
Log.i(TAG, "相机开始识别");
}
@@ -156,17 +155,26 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
}
}
// 以前的方式
// intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
// 推荐的方式
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
// 手机返回按钮
@Override
public void onBackPressed() {
Log.e(TAG, "相机onBackPressed");
MethodChannel channel = FlutterFaceDiscernPlugin.staticChannel;
if (Objects.nonNull(channel)) {
channel.invokeMethod("faceDiscernBack", null);
}
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClassName(this.getPackageName(), this.getPackageName() + ".MainActivity");
this.startActivity(intent);
MethodChannel channel = FlutterFaceDiscernPlugin.staticChannel;
if (Objects.isNull(channel)) return;
channel.invokeMethod("faceDiscernBack", null);
}
@@ -187,25 +195,8 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
public void onCameraOpened(Camera camera, int cameraId, int displayOrientation, boolean isMirror) {
runOnUiThread(() -> {
Camera.Size previewSizeRgb = camera.getParameters().getPreviewSize();
ViewGroup.LayoutParams layoutParams = adjustPreviewViewSize(
binding.dualCameraTexturePreviewRgb,
binding.dualCameraTexturePreviewRgb,
binding.dualCameraFaceRectView,
previewSizeRgb,
displayOrientation,
1.0f
);
rgbFaceRectTransformer = new FaceRectTransformer(
previewSizeRgb.width,
previewSizeRgb.height,
layoutParams.width,
layoutParams.height,
displayOrientation,
cameraId,
isMirror,
true,
true
);
ViewGroup.LayoutParams layoutParams = adjustPreviewViewSize(binding.dualCameraTexturePreviewRgb, binding.dualCameraTexturePreviewRgb, binding.dualCameraFaceRectView, previewSizeRgb, displayOrientation, 1.0f);
rgbFaceRectTransformer = new FaceRectTransformer(previewSizeRgb.width, previewSizeRgb.height, layoutParams.width, layoutParams.height, displayOrientation, cameraId, isMirror, true, true);
viewModel.onRgbCameraOpened(camera);
viewModel.setRgbFaceRectTransformer(rgbFaceRectTransformer);
Log.e(TAG, "相机打开,宽:" + previewSizeRgb.width + ",高:" + previewSizeRgb.height + ";layout宽:" + layoutParams.width + ",layout高:" + layoutParams.height + ";");
@@ -249,16 +240,7 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
}
}
Point previewSize = new Point(binding.dualCameraTexturePreviewRgb.getMeasuredWidth(), binding.dualCameraTexturePreviewRgb.getMeasuredHeight());
rgbCameraHelper = new DualCameraHelper.Builder()
.previewViewSize(previewSize)
.previewSize(previewSize)
.rotation(getWindowManager().getDefaultDisplay().getRotation())
.additionalRotation(0)
.specificCameraId(mCameraId)
.isMirror(false)
.previewOn(binding.dualCameraTexturePreviewRgb)
.cameraListener(cameraListener)
.build();
rgbCameraHelper = new DualCameraHelper.Builder().previewViewSize(previewSize).previewSize(previewSize).rotation(getWindowManager().getDefaultDisplay().getRotation()).additionalRotation(0).specificCameraId(mCameraId).isMirror(false).previewOn(binding.dualCameraTexturePreviewRgb).cameraListener(cameraListener).build();
rgbCameraHelper.init();
rgbCameraHelper.start();
viewModel.setRgbCameraHelper(rgbCameraHelper);
@@ -20,8 +20,10 @@ import com.arcsoft.face.LivenessInfo;
import com.arcsoft.face.LivenessParam;
import com.arcsoft.face.enums.DetectFaceOrientPriority;
import com.arcsoft.face.enums.DetectMode;
import com.example.pj_supermarket_cloud.MainActivity;
import com.google.gson.Gson;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.plugins.facediscern.tool.camera.DualCameraHelper;
import io.flutter.plugins.facediscern.tool.camera.config.PreviewConfig;
import io.flutter.plugins.facediscern.tool.face.constants.FaceBrodConstant;
@@ -36,6 +38,7 @@ import io.flutter.plugins.facediscern.tool.face.model.FaceEntity;
import io.flutter.plugins.facediscern.tool.face.model.FacePreviewInfo;
import io.flutter.plugins.facediscern.tool.face.model.RecognizeConfiguration;
import io.flutter.plugins.facediscern.tool.face.widget.FaceRectView;
import io.flutter.plugins.facediscern.ui.FaceDiscern;
import java.util.ArrayList;
import java.util.HashMap;
@@ -290,17 +293,15 @@ public class FaceDiscernViewModel extends ViewModel implements RecognizeCallback
if (flutterFaceCallbackIntent == null) {
flutterFaceCallbackIntent = new Intent(FaceBrodConstant.FACE_GLOBAL_INTENT);
}
Log.i(TAG, "人脸识别成功json:" + new Gson().toJson(faceDiscern));
flutterFaceCallbackIntent.putExtra("json", new Gson().toJson(faceDiscern));
context.sendBroadcast(flutterFaceCallbackIntent);
faceDiscern = null;
Log.i(TAG, "人脸识别成功json:" + new Gson().toJson(faceDiscern));
if (context instanceof Activity) {
Thread.sleep(500);
String packageName = context.getPackageName();
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
intent.setClassName(packageName, packageName + ".MainActivity");
Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
context.startActivity(intent);
context.sendBroadcast(flutterFaceCallbackIntent);
faceDiscern = null;
}
} catch (Exception e) {
Log.e(TAG, "提示文字变更的回调,错误error:" + e.getMessage(), e);
@@ -2,13 +2,19 @@ package com.example.pj_supermarket_cloud
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugins.facediscern.flutter.FlutterFaceDiscernPlugin
class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
// 人脸识别插件
val flutterFaceDiscernPlugin = FlutterFaceDiscernPlugin()
flutterEngine.plugins.add(flutterFaceDiscernPlugin)
GeneratedPluginRegistrant.registerWith(flutterEngine)
}
}
+2 -7
View File
@@ -50,14 +50,9 @@ class MainApp extends StatelessWidget {
localizationsDelegates: FLocalizations.localizationsDelegates,
supportedLocales: FLocalizations.supportedLocales,
builder: EasyLoading.init(
builder: (context, child) => FTheme(
builder: (_, childSecond) => FTheme(
data: themeData,
child: MediaQuery(
data: MediaQuery.of(context).copyWith(
viewInsets: MediaQuery.of(context).viewInsets,
),
child: child!,
),
child: childSecond!,
),
),
);
+1 -1
View File
@@ -35,8 +35,8 @@ class RoutePages {
page: () => const CanteenProductPage(),
binding: BindingsBuilder(() {
Get.lazyPut(() => SelectPayTypeDialogController());
Get.lazyPut(() => PanelController());
Get.lazyPut(() => CanteenProductController());
Get.lazyPut(() => PanelController());
}),
),
GetPage(
-4
View File
@@ -11,8 +11,6 @@ abstract class AppFaceTool {
// 跳转到人脸识别页面
static Future<bool> jumpFacePage() async {
final faceCount = await FaceDiscernPlugs.getFaceCount();
if (faceCount == 0) return false;
final isJump = await FaceDiscernPlugs.jumpFaceDiscernPage();
if (!isJump) return false;
Future.delayed(const Duration(seconds: 2), () {
@@ -40,8 +38,6 @@ abstract class AppFaceTool {
String? userId,
bool forceRegister = false,
}) async {
final isActive = await AppFaceTool.isActiveSdk();
if (!isActive) return false;
var faceCount = await FaceDiscernPlugs.getFaceCount();
if (faceCount == 0 || forceRegister) {
final list = await FaceDiscernPlugs.registerFaceByDatabase(
+1 -8
View File
@@ -8,7 +8,7 @@ import 'package:sqflite/sqflite.dart';
abstract class AppFileTool {
static const _tag = "app文件工具";
static const _baseDir = "pj";
static const _baseDir = "pj_cashier";
static const _baseBackupDir = "backup";
static const _backupDatabaseDir = "database";
static const _backupLoggerDir = "logger";
@@ -47,13 +47,6 @@ abstract class AppFileTool {
return dir;
}
/// 保存数据库文件地址
static Future<void> setDatabasePath(String sqlAddress) async {
final appSetting = await AppSettingTool.getSysSetting();
appSetting.sqlAddress = sqlAddress;
await AppSettingTool.setSysSetting(appSetting);
}
/// 创建数据库文件备份地址
static Future<String?> getDatabaseBackupPath() async {
String backupDir = await getExternalPath(backupExternalPath: false);
@@ -2,7 +2,6 @@ import 'dart:async';
import 'package:event_bus/event_bus.dart';
import 'package:get/get.dart';
import 'package:sqflite/sqflite.dart';
import 'package:pj_supermarket_cloud/common/index.dart';
@@ -35,7 +34,7 @@ class AppControl extends GetxController {
serialCardManage.close();
srialSteelyardManage.close();
AppNetworkTool.closeListenNetwork();
TtsManage.dispose();
// TtsManage.dispose();
}
Future<void> initAsync() async {
@@ -44,11 +43,8 @@ class AppControl extends GetxController {
serialCardManage = SerialCardManage();
srialSteelyardManage = SerialSteelyardManage();
AppNetworkTool.listenNetwork();
await AppFileTool.setDatabasePath(
await getDatabasesPath(),
);
await AppFileTool.backupSqlFile();
await TtsManage.initialize();
// await AppFileTool.backupSqlFile();
// await TtsManage.initialize();
Get.offAllNamed(RouteNames.login);
}
}
+1
View File
@@ -3,4 +3,5 @@ library;
export './constants.dart';
export './crt.dart';
export './images.dart';
export 'keys.dart';
export './svgs.dart';
+38 -6
View File
@@ -1,6 +1,5 @@
import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:common_utils/common_utils.dart';
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
import 'package:flutter/material.dart';
@@ -16,11 +15,31 @@ Widget appNetworkImg(
double imgHeight = 60,
BoxFit fit = BoxFit.cover,
}) {
return CachedNetworkImage(
imageUrl: AppNetworkTool.ossImage(src),
placeholder: (context, url) =>
CircularProgressIndicator().width(50.w).height(50.w),
errorWidget: (context, url, error) {
return Image.network(
src,
width: imgWidth,
height: imgHeight,
fit: fit,
loadingBuilder:
(BuildContext context, Widget child, ImageChunkEvent? loadingProgress) {
if (loadingProgress == null) {
return child;
} else {
return Center(
child: SizedBox(
width: imgHeight,
height: imgHeight,
child: CircularProgressIndicator(
value: loadingProgress.expectedTotalBytes != null
? loadingProgress.cumulativeBytesLoaded /
(loadingProgress.expectedTotalBytes ?? 1)
: null,
),
),
);
}
},
errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) {
final theme = FTheme.of(context);
return FIcon(
FAssets.icons.globeLock,
@@ -29,6 +48,19 @@ Widget appNetworkImg(
).width(imgWidth * 0.5).height(imgHeight * 0.5);
},
);
// return CachedNetworkImage(
// imageUrl: AppNetworkTool.ossImage(src),
// placeholder: (context, url) =>
// CircularProgressIndicator().width(50.w).height(50.w),
// errorWidget: (context, url, error) {
// final theme = FTheme.of(context);
// return FIcon(
// FAssets.icons.globeLock,
// color: theme.colorScheme.error,
// size: theme.typography.base.fontSize,
// ).width(imgWidth * 0.5).height(imgHeight * 0.5);
// },
// );
}
Widget appFileImg(
+6 -6
View File
@@ -103,15 +103,15 @@ Widget orderSelectPanel(
appPrice(context, price),
SizedBox(width: 10.w),
FIcon(
FAssets.icons.minus,
FAssets.icons.plus,
color: theme.colorScheme.secondary,
)
.width(height.w)
.height(double.infinity)
.decorated(color: theme.colorScheme.primary)
.onTap(() {
if (total > 0) {
onChange(total - 1, index);
if (total < 100) {
onChange(total + 1, index);
}
}),
Text(
@@ -122,15 +122,15 @@ Widget orderSelectPanel(
borderRadius: theme.style.borderRadius / 2,
),
FIcon(
FAssets.icons.plus,
FAssets.icons.minus,
color: theme.colorScheme.secondary,
)
.width(height.w)
.height(double.infinity)
.decorated(color: theme.colorScheme.error)
.onTap(() {
if (total < 100) {
onChange(total + 1, index);
if (total > 0) {
onChange(total - 1, index);
}
}),
].toRow(mainAxisAlignment: MainAxisAlignment.end).expanded(),
@@ -38,6 +38,8 @@ class SelectPayTypeDialogController extends GetxController {
final app = Get.find<AppControl>();
late SysSetting appSetting;
final payTypeRadioC = FRadioSelectGroupController<OrderPayDisplayType>();
Rxn<ServiceUser?> payUser = Rxn(null);
@@ -64,6 +66,8 @@ class SelectPayTypeDialogController extends GetxController {
@override
void onInit() async {
super.onInit();
appSetting = await AppSettingTool.getSysSetting();
_listenAndroidFaceBack();
// 监听支付方式变化
payTypeRadioC.addValueListener((v) {
final payType = OrderPayDisplayType.values.fromCode(
@@ -83,15 +87,8 @@ class SelectPayTypeDialogController extends GetxController {
payTypeRadioC.dispose();
}
_closeStatus() {
payUser.value = null;
isRecognition.value = false;
globalQrCode = null;
_faceCallbackLock = false;
}
Future<void> initPayType() async {
final appSetting = await AppSettingTool.getSysSetting();
void initPayType() {
_closeStatus();
if (appSetting.defaultPayDisplayType != null) {
payTypeRadioC.value = {appSetting.defaultPayDisplayType!};
}
@@ -100,13 +97,20 @@ class SelectPayTypeDialogController extends GetxController {
}
}
_closeFacility() {
_closeStatus() {
payUser.value = null;
isRecognition.value = false;
globalQrCode = null;
_faceCallbackLock = false;
// 设备
BarcodeScanManage.instance.dispose();
app.serialCardManage.close();
}
_closeFaceDiscern() {
// 取消人脸监听
faceDiscernListen?.cancel();
// 关闭加载提示
EasyLoading.dismiss();
}
// |开始识别|点击
@@ -138,10 +142,8 @@ class SelectPayTypeDialogController extends GetxController {
orderPayDisplayType.value!,
globalQrCode,
);
Navigator.of(Get.context!).pop();
_closeStatus();
_closeFacility();
_closeFaceDiscern();
Navigator.of(Get.context!, rootNavigator: true).pop();
}
// |取消|点击
@@ -149,17 +151,12 @@ class SelectPayTypeDialogController extends GetxController {
if (isRecognition.value) {
final flag = await appMessageDialog(Get.context!, "是否取消识别");
if (!flag) return;
_closeStatus();
_closeFacility();
_closeFaceDiscern();
Navigator.of(Get.context!).pop();
Navigator.of(Get.context!, rootNavigator: true).pop();
return;
}
_closeStatus();
_closeFacility();
_closeFaceDiscern();
onCancel?.call();
Navigator.of(Get.context!).pop();
Navigator.of(Get.context!, rootNavigator: true).pop();
}
// **************************************************************************
@@ -332,7 +329,6 @@ class SelectPayTypeDialogController extends GetxController {
Toast.error(msg: "跳转到人脸检测页面失败");
throw Error();
}
_listenAndroidFaceBack();
faceDiscernListen = FaceDiscernPlugs.faceStream.listen((event) {
if (event == null) return;
if (_faceCallbackLock) return;
@@ -353,7 +349,6 @@ class SelectPayTypeDialogController extends GetxController {
// android人脸识别成功回调
Future<void> _faceDiscernAfter(FaceStream event) async {
try {
EasyLoading.dismiss();
EasyLoading.show(
status: '获取用户信息中...',
maskType: EasyLoadingMaskType.black,
@@ -422,99 +417,104 @@ class SelectPayTypeDialogController extends GetxController {
}
}
Future<void> selectPayTypeDialog(BuildContext context) async {
Future<void> selectPayTypeDialog() async {
final context = Get.context!;
final payTypeC = Get.find<SelectPayTypeDialogController>();
await payTypeC.initPayType();
payTypeC.initPayType();
final theme = FTheme.of(context);
final width = context.width;
final height = context.height;
showDialog(
context: context,
return showDialog(
context: Get.context!,
barrierDismissible: false,
builder: (BuildContext context) => FDialog(
direction: Axis.vertical,
title: Text("选择支付方式", style: theme.typography.lg),
body: <Widget>[
Obx(
() => FSelectGroup(
enabled: payTypeC.payUser.value == null,
controller: payTypeC.payTypeRadioC,
style: theme.selectGroupStyle.copyWith(
labelLayoutStyle:
theme.selectGroupStyle.labelLayoutStyle.copyWith(
childPadding: EdgeInsets.symmetric(
vertical: 10.h,
),
),
radioStyle: theme.selectGroupStyle.radioStyle.copyWith(
padding: EdgeInsets.symmetric(
vertical: 10.h,
),
),
),
items: payTypeC.usePayDisplayTypeList
.map<FSelectGroupItem<OrderPayDisplayType>>(
(v) => FSelectGroupItem.radio(
value: v,
label: Text(
v.title,
style: theme.typography.xl,
builder: (BuildContext _) {
return PopScope(
child: FDialog(
direction: Axis.vertical,
title: Text("选择支付方式", style: theme.typography.lg),
body: <Widget>[
Obx(
() => FSelectGroup(
enabled: payTypeC.payUser.value == null,
controller: payTypeC.payTypeRadioC,
style: theme.selectGroupStyle.copyWith(
labelLayoutStyle:
theme.selectGroupStyle.labelLayoutStyle.copyWith(
childPadding: EdgeInsets.symmetric(
vertical: 10.h,
),
),
)
.toList(),
),
),
SizedBox(height: 20.h),
Obx(
() => Visibility(
visible: payTypeC.payUser.value == null,
replacement: selectPayTypeUser(
context,
payTypeC.payUser.value,
radioStyle: theme.selectGroupStyle.radioStyle.copyWith(
padding: EdgeInsets.symmetric(
vertical: 10.h,
),
),
),
items: payTypeC.usePayDisplayTypeList
.map<FSelectGroupItem<OrderPayDisplayType>>(
(v) => FSelectGroupItem.radio(
value: v,
label: Text(
v.title,
style: theme.typography.xl,
),
),
)
.toList(),
),
),
child: selectPayTypeHint(
context,
payTypeC.orderPayDisplayType.value,
),
),
).center().expanded(),
].toColumn().width(width * 0.5).height(height * 0.6),
actions: [
<Widget>[
Obx(
() => FButton(
label: Text(
payTypeC.payUser.value == null ? "开始识别" : "确定支付",
style: theme.typography.xl.copyWith(
color: theme.colorScheme.secondary,
SizedBox(height: 20.h),
Obx(
() => Visibility(
visible: payTypeC.payUser.value == null,
replacement: selectPayTypeUser(
context,
payTypeC.payUser.value,
),
child: selectPayTypeHint(
context,
payTypeC.orderPayDisplayType.value,
),
),
onPress: () {
if (payTypeC.payUser.value == null) {
payTypeC.doRecognition();
} else {
payTypeC.doSubmit();
}
},
),
).flexible(flex: 1),
SizedBox(width: 20.w),
FButton(
style: FButtonStyle.destructive,
label: Text(
"取消",
style: theme.typography.xl.copyWith(
color: theme.colorScheme.secondary,
),
),
onPress: () {
payTypeC.doCancel();
},
).flexible(flex: 1),
].toRow(),
],
),
).center().expanded(),
].toColumn().width(width * 0.5).height(height * 0.6),
actions: [
<Widget>[
Obx(
() => FButton(
label: Text(
payTypeC.payUser.value == null ? "开始识别" : "确定支付",
style: theme.typography.xl.copyWith(
color: theme.colorScheme.secondary,
),
),
onPress: () {
if (payTypeC.payUser.value == null) {
payTypeC.doRecognition();
} else {
payTypeC.doSubmit();
}
},
),
).flexible(flex: 1),
SizedBox(width: 20.w),
FButton(
style: FButtonStyle.destructive,
label: Text(
"取消",
style: theme.typography.xl.copyWith(
color: theme.colorScheme.secondary,
),
),
onPress: () {
payTypeC.doCancel();
},
).flexible(flex: 1),
].toRow(),
],
),
);
},
);
}
+2 -12
View File
@@ -103,23 +103,13 @@ class CanteenProductController extends GetxController with OrderMixin {
hourTypeC.dispose();
}
// |下单|点击识别按钮
doRecognition() {
final payTypeC = Get.find<SelectPayTypeDialogController>();
payTypeC.payUser.value = payUser.value;
payTypeC.orderPayDisplayType.value = orderPayDisplayType.value;
}
// |下单|点击购买
doPay() async {
Future<void> doPay() async {
final validShopCar = _validateShopCar();
if (!validShopCar) return;
// 创建本地订单
await createSqlOrder();
final payTypeC = Get.find<SelectPayTypeDialogController>();
payTypeC.payUser.value = payUser.value;
payTypeC.orderPayDisplayType.value = orderPayDisplayType.value;
selectPayTypeDialog(Get.context!);
await selectPayTypeDialog();
}
// |下单|点击取消下单
+10 -12
View File
@@ -219,6 +219,16 @@ class CanteenProductPage extends GetView<CanteenProductController> {
<Widget>[
SizedBox(height: 20.h),
<Widget>[
FButton(
label: Text(
"支付",
style: theme.typography.xl.copyWith(
color: theme.colorScheme.secondary,
),
),
onPress: () => controller.doPay(),
).flexible(flex: 1),
SizedBox(width: 20.w),
FButton(
style: FButtonStyle.destructive,
label: Text(
@@ -229,18 +239,6 @@ class CanteenProductPage extends GetView<CanteenProductController> {
),
onPress: () => controller.doCancelPay(),
).flexible(flex: 1),
SizedBox(width: 20.w),
FButton(
label: Text(
"支付",
style: theme.typography.xl.copyWith(
color: theme.colorScheme.secondary,
),
),
onPress: () => controller.payUser.value?.userId == null
? controller.doPay()
: controller.doRecognition(),
).flexible(flex: 1),
].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween),
].toColumn(),
].toColumn().padding(vertical: 10.h, horizontal: 10.w);
+1 -1
View File
@@ -75,7 +75,7 @@ class PanelController extends GetxController {
Get.offAndToNamed(RouteNames.login);
break;
case PanelType.test:
await TtsManage.speak("购买成功,总金额100元");
await AppFaceTool.jumpFacePage();
break;
default:
break;
@@ -16,9 +16,9 @@ Future<void> _bindServiceDialog(BuildContext context, SysSetting sys) async {
uniqueCodeC.text = sys.serviceId ?? "";
} else if (AppSysTool.isDev()) {
// 超市
// uniqueCodeC.text = "1894303392833716226";
uniqueCodeC.text = "1894303392833716226";
// 测试
uniqueCodeC.text = "1896157295523049473";
// uniqueCodeC.text = "1896157295523049473";
}
await showAdaptiveDialog(
context: context,
-64
View File
@@ -142,30 +142,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "8.9.4"
cached_network_image:
dependency: "direct main"
description:
name: cached_network_image
sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f"
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.3.1"
cached_network_image_platform_interface:
dependency: transitive
description:
name: cached_network_image_platform_interface
sha256: ff0c949e323d2a1b52be73acce5b4a7b04063e61414c8ca542dbba47281630a7
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.1.0"
cached_network_image_web:
dependency: transitive
description:
name: cached_network_image_web
sha256: "6322dde7a5ad92202e64df659241104a43db20ed594c41ca18de1014598d7996"
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
characters:
dependency: transitive
description:
@@ -435,14 +411,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
flutter_cache_manager:
dependency: transitive
description:
name: flutter_cache_manager
sha256: a77f77806a790eb9ba0118a5a3a936e81c4fea2b61533033b2b0c3d50bbde5ea
url: "https://pub.flutter-io.cn"
source: hosted
version: "3.4.0"
flutter_easyloading:
dependency: "direct main"
description:
@@ -834,14 +802,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.6"
octo_image:
dependency: transitive
description:
name: octo_image
sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
package_config:
dependency: transitive
description:
@@ -1058,14 +1018,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.3"
rxdart:
dependency: transitive
description:
name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.flutter-io.cn"
source: hosted
version: "0.28.0"
shelf:
dependency: transitive
description:
@@ -1119,14 +1071,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.10.0"
sprintf:
dependency: transitive
description:
name: sprintf
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
url: "https://pub.flutter-io.cn"
source: hosted
version: "7.0.0"
sqflite:
dependency: "direct main"
description:
@@ -1295,14 +1239,6 @@ packages:
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.2.2"
uuid:
dependency: transitive
description:
name: uuid
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
url: "https://pub.flutter-io.cn"
source: hosted
version: "4.5.1"
vector_graphics:
dependency: transitive
description:
+1 -1
View File
@@ -27,7 +27,7 @@ dependencies:
# 图片处理
image: ^4.3.0
# 图片缓存
cached_network_image: 3.3.1
# cached_network_image: 3.3.1
# 表格
data_table_2: ^2.5.18
# 分页