Browse Source

Update 优化代码,build.gradle 去除kts语法

Yue 1 week ago
parent
commit
dddd69e69c

+ 0 - 3
UI/CF.APP/chicken_farm/.dart_tool/widget_preview_scaffold/devtools_options.yaml

@@ -1,3 +0,0 @@
-description: This file stores settings for Dart & Flutter DevTools.
-documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
-extensions:

+ 29 - 13
UI/CF.APP/chicken_farm/android/app/build.gradle.kts → UI/CF.APP/chicken_farm/android/app/build.gradle

@@ -1,44 +1,60 @@
 plugins {
-    id("com.android.application")
-    id("kotlin-android")
+    id "com.android.application"
     // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
-    id("dev.flutter.flutter-gradle-plugin")
+    id "dev.flutter.flutter-gradle-plugin"
 }
 
 android {
-    namespace = "com.vber.chicken_farm"
-    compileSdk = flutter.compileSdkVersion
-    ndkVersion = flutter.ndkVersion
+    namespace "com.vber.chicken_farm"
+    compileSdk flutter.compileSdkVersion
+    ndkVersion flutter.ndkVersion
 
     compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_17
-        targetCompatibility = JavaVersion.VERSION_17
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
     }
 
-    kotlinOptions {
-        jvmTarget = JavaVersion.VERSION_17.toString()
+    sourceSets {
+        main {
+            jni.srcDirs = []
+            jniLibs.srcDirs = ['libs']
+        }
     }
 
+
     defaultConfig {
         // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
-        applicationId = "com.vber.chicken_farm"
+        applicationId "com.vber.chicken_farm"
         // You can update the following values to match your application needs.
         // For more information, see: https://flutter.dev/to/review-gradle-config.
         minSdk = flutter.minSdkVersion
         targetSdk = flutter.targetSdkVersion
         versionCode = flutter.versionCode
         versionName = flutter.versionName
+
+     
     }
 
     buildTypes {
         release {
             // TODO: Add your own signing config for the release build.
             // Signing with the debug keys for now, so `flutter run --release` works.
-            signingConfig = signingConfigs.getByName("debug")
+            signingConfig = signingConfigs.debug
         }
     }
+
+    lintOptions {
+        checkReleaseBuilds false
+        abortOnError false
+    }
+
+}
+
+dependencies {
+    // implementation fileTree(include: ['*.aar'], dir: 'libs')
+    implementation files('libs\\lcrrgxmodule-release.aar')
 }
 
 flutter {
     source = "../.."
-}
+}

BIN
UI/CF.APP/chicken_farm/android/app/libs/lcrrgxmodule-release.aar


BIN
UI/CF.APP/chicken_farm/android/app/libs/library1.0.7-release.aar


+ 7 - 0
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/MainActivity.java

@@ -0,0 +1,7 @@
+package com.vber.chicken_farm;
+
+import io.flutter.embedding.android.FlutterActivity;
+
+public class MainActivity extends FlutterActivity {
+
+}

+ 0 - 5
UI/CF.APP/chicken_farm/android/app/src/main/kotlin/com/example/chicken_farm/MainActivity.kt

@@ -1,5 +0,0 @@
-package com.vber.chicken_farm
-
-import io.flutter.embedding.android.FlutterActivity
-
-class MainActivity : FlutterActivity()

BIN
UI/CF.APP/chicken_farm/android/app/src/main/res/raw/barcodebeep.ogg


+ 22 - 0
UI/CF.APP/chicken_farm/android/build.gradle

@@ -0,0 +1,22 @@
+allprojects {
+    repositories {
+        google()
+        mavenCentral()
+    }
+}
+
+def newBuildDir = rootProject.layout.buildDirectory.dir("../../build").get()
+rootProject.layout.buildDirectory.set(newBuildDir)
+
+subprojects {
+    def newSubprojectBuildDir = newBuildDir.dir(project.name)
+    project.layout.buildDirectory.set(newSubprojectBuildDir)
+}
+
+subprojects {
+    project.evaluationDependsOn(":app")
+}
+
+tasks.register("clean", Delete) {
+    delete rootProject.layout.buildDirectory
+}

+ 0 - 24
UI/CF.APP/chicken_farm/android/build.gradle.kts

@@ -1,24 +0,0 @@
-allprojects {
-    repositories {
-        google()
-        mavenCentral()
-    }
-}
-
-val newBuildDir: Directory =
-    rootProject.layout.buildDirectory
-        .dir("../../build")
-        .get()
-rootProject.layout.buildDirectory.value(newBuildDir)
-
-subprojects {
-    val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
-    project.layout.buildDirectory.value(newSubprojectBuildDir)
-}
-subprojects {
-    project.evaluationDependsOn(":app")
-}
-
-tasks.register<Delete>("clean") {
-    delete(rootProject.layout.buildDirectory)
-}

+ 5 - 1
UI/CF.APP/chicken_farm/android/gradle.properties

@@ -1,3 +1,7 @@
 org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
 android.useAndroidX=true
-android.enableJetifier=true
+android.enableJetifier=true
+// 添加这些配置以提高构建稳定性
+kotlin.incremental=false
+org.gradle.caching=false
+org.gradle.parallel=false

+ 25 - 0
UI/CF.APP/chicken_farm/android/settings.gradle

@@ -0,0 +1,25 @@
+pluginManagement {
+    def flutterSdkPath = {
+        def properties = new Properties()
+        file("local.properties").withInputStream { properties.load(it) }
+        def flutterSdkPath = properties.getProperty("flutter.sdk")
+        assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+        return flutterSdkPath
+    }()
+
+    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
+
+    repositories {
+        google()
+        mavenCentral()
+        gradlePluginPortal()
+    }
+}
+
+plugins {
+    id "dev.flutter.flutter-plugin-loader" version "1.0.0"
+    id "com.android.application" version "8.11.1" apply false
+    id "org.jetbrains.kotlin.android" version "2.2.20" apply false
+}
+
+include ":app"

+ 0 - 26
UI/CF.APP/chicken_farm/android/settings.gradle.kts

@@ -1,26 +0,0 @@
-pluginManagement {
-    val flutterSdkPath =
-        run {
-            val properties = java.util.Properties()
-            file("local.properties").inputStream().use { properties.load(it) }
-            val flutterSdkPath = properties.getProperty("flutter.sdk")
-            require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
-            flutterSdkPath
-        }
-
-    includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
-
-    repositories {
-        google()
-        mavenCentral()
-        gradlePluginPortal()
-    }
-}
-
-plugins {
-    id("dev.flutter.flutter-plugin-loader") version "1.0.0"
-    id("com.android.application") version "8.11.1" apply false
-    id("org.jetbrains.kotlin.android") version "2.2.20" apply false
-}
-
-include(":app")

+ 30 - 0
UI/CF.APP/chicken_farm/lib/core/services/pda/pda_rfid_service.dart

@@ -0,0 +1,30 @@
+import 'package:flutter/services.dart';
+
+class PdaRfidService {
+  static const platform = MethodChannel('com.vber.chicken_farm/pda_scanner');
+
+  /// 读取RFID标签
+  ///
+  /// 返回RFID标签字符串,如果读取失败会抛出异常
+  static Future<String> readRfid() async {
+    try {
+      final String result = await platform.invokeMethod('readRfid');
+      return result;
+    } on PlatformException catch (e) {
+      throw Exception("RFID读取失败: ${e.message}");
+    }
+  }
+
+  /// 写入RFID标签
+  ///
+  /// [data] 要写入的数据
+  /// 返回写入结果,如果写入失败会抛出异常
+  static Future<String> writeRfid(String data) async {
+    try {
+      final String result = await platform.invokeMethod('writeRfid', {'data': data});
+      return result;
+    } on PlatformException catch (e) {
+      throw Exception("RFID写入失败: ${e.message}");
+    }
+  }
+}

+ 42 - 0
UI/CF.APP/chicken_farm/lib/core/services/pda/pda_scanner_service.dart

@@ -0,0 +1,42 @@
+import 'package:flutter/services.dart';
+
+class PdaScannerService {
+  static const platform = MethodChannel('com.vber.chicken_farm/pda_scanner');
+
+  /// 调用PDA设备的扫码功能
+  ///
+  /// 返回扫码结果字符串,如果扫码失败会抛出异常
+  static Future<String> scanBarcode() async {
+    try {
+      final String result = await platform.invokeMethod('scanBarcode');
+      return result;
+    } on PlatformException catch (e) {
+      throw Exception("扫码失败: ${e.message}");
+    }
+  }
+  
+  /// 读取RFID标签
+  ///
+  /// 返回RFID标签字符串,如果读取失败会抛出异常
+  static Future<String> readRfid() async {
+    try {
+      final String result = await platform.invokeMethod('readRfid');
+      return result;
+    } on PlatformException catch (e) {
+      throw Exception("RFID读取失败: ${e.message}");
+    }
+  }
+  
+  /// 写入RFID标签
+  ///
+  /// [data] 要写入的数据
+  /// 返回写入结果,如果写入失败会抛出异常
+  static Future<String> writeRfid(String data) async {
+    try {
+      final String result = await platform.invokeMethod('writeRfid', {'data': data});
+      return result;
+    } on PlatformException catch (e) {
+      throw Exception("RFID写入失败: ${e.message}");
+    }
+  }
+}

+ 46 - 23
UI/CF.APP/chicken_farm/lib/pages/breeding/cage_change_page.dart

@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:chicken_farm/components/vb_app_bar.dart';
 import 'package:chicken_farm/core/utils/toast.dart';
+import 'package:chicken_farm/core/services/pda/pda_scanner_service.dart';
 
 class CageChangePage extends StatefulWidget {
   const CageChangePage({super.key});
@@ -14,7 +15,7 @@ class _CageChangePageState extends State<CageChangePage> {
   String? _targetCageId;
   final List<String> _rfids = [];
 
-  // 模拟扫描状态
+  // 扫描状态
   bool _isScanningSource = false;
   bool _isScanningTarget = false;
   bool _isScanningRfid = false;
@@ -33,7 +34,7 @@ class _CageChangePageState extends State<CageChangePage> {
               title: '源笼号',
               value: _sourceCageId,
               isScanning: _isScanningSource,
-              onScanPressed: _simulateScanSourceCage,
+              onScanPressed: _scanSourceCage,
               onChangePressed: _handleChangeSourceCage,
             ),
 
@@ -44,7 +45,7 @@ class _CageChangePageState extends State<CageChangePage> {
               title: '目标笼号',
               value: _targetCageId,
               isScanning: _isScanningTarget,
-              onScanPressed: _simulateScanTargetCage,
+              onScanPressed: _scanTargetCage,
               onChangePressed: _handleChangeTargetCage,
             ),
             const SizedBox(height: 15),
@@ -204,7 +205,7 @@ class _CageChangePageState extends State<CageChangePage> {
                         child: CircularProgressIndicator(strokeWidth: 2),
                       )
                     : const Icon(Icons.add, size: 20),
-                onPressed: _simulateScanRfid,
+                onPressed: _scanRfid,
               ),
             ],
           ),
@@ -213,65 +214,87 @@ class _CageChangePageState extends State<CageChangePage> {
     );
   }
 
-  // 模拟扫描源笼号
-  void _simulateScanSourceCage() {
+  // 扫描源笼号
+  void _scanSourceCage() async {
     if (_isScanningSource) return;
 
     setState(() {
       _isScanningSource = true;
     });
 
-    // 模拟扫描过程
-    Future.delayed(const Duration(seconds: 1), () {
+    try {
+      final result = await PdaScannerService.scanBarcode();
       if (mounted) {
         setState(() {
-          _sourceCageId = 'SC-2025-001'; // 模拟扫描结果
+          _sourceCageId = result;
           _isScanningSource = false;
         });
         ToastUtil.success('源笼号扫描成功');
       }
-    });
+    } catch (e) {
+      if (mounted) {
+        setState(() {
+          _isScanningSource = false;
+        });
+        ToastUtil.error('扫描失败: $e');
+      }
+    }
   }
 
-  // 模拟扫描目标笼号
-  void _simulateScanTargetCage() {
+  // 扫描目标笼号
+  void _scanTargetCage() async {
     if (_isScanningTarget) return;
 
     setState(() {
       _isScanningTarget = true;
     });
 
-    // 模拟扫描过程
-    Future.delayed(const Duration(seconds: 1), () {
+    try {
+      final result = await PdaScannerService.scanBarcode();
       if (mounted) {
         setState(() {
-          _targetCageId = 'TC-2025-008'; // 模拟扫描结果
+          _targetCageId = result;
           _isScanningTarget = false;
         });
         ToastUtil.success('目标笼号扫描成功');
       }
-    });
+    } catch (e) {
+      if (mounted) {
+        setState(() {
+          _isScanningTarget = false;
+        });
+        ToastUtil.error('扫描失败: $e');
+      }
+    }
   }
 
-  // 模拟扫描电子编号
-  void _simulateScanRfid() {
+  // 扫描电子编号
+  void _scanRfid() async {
     if (_isScanningRfid) return;
 
     setState(() {
       _isScanningRfid = true;
     });
 
-    // 模拟扫描过程
-    Future.delayed(const Duration(seconds: 1), () {
+    try {
+      // 使用实际的RFID读取功能
+      final result = await PdaScannerService.readRfid();
       if (mounted) {
         setState(() {
           // 每次添加一个新的电子编号到数组开头(模拟按一次实体按钮扫描一个电子编号)
-          _rfids.insert(0, 'RFID-${DateTime.now().millisecondsSinceEpoch}');
+          _rfids.insert(0, result);
           _isScanningRfid = false;
         });
         ToastUtil.success('鸡扫描成功');
       }
-    });
+    } catch (e) {
+      if (mounted) {
+        setState(() {
+          _isScanningRfid = false;
+        });
+        ToastUtil.error('RFID读取失败: $e');
+      }
+    }
   }
 
   // 重新扫描源笼号
@@ -309,4 +332,4 @@ class _CageChangePageState extends State<CageChangePage> {
       _rfids.clear();
     });
   }
-}
+}

+ 82 - 0
UI/CF.APP/chicken_farm/lib/services/pda_service.dart

@@ -0,0 +1,82 @@
+import 'dart:async';
+import 'package:flutter/services.dart';
+
+/// PDA服务类,用于处理扫描和RFID功能
+class PdaService {
+  static const MethodChannel _methodChannel = MethodChannel(
+    'com.vber.chicken_farm/pda_scanner',
+  );
+
+  static const EventChannel _eventChannel = EventChannel(
+    'com.vber.chicken_farm/pda_scanner_event',
+  );
+
+  static final PdaService _instance = PdaService._internal();
+  factory PdaService() => _instance;
+  PdaService._internal();
+
+  StreamSubscription? _scanSubscription;
+  final StreamController<String?> _scanResultController =
+      StreamController<String?>.broadcast();
+
+  /// 扫描条形码/二维码
+  Future<void> scanBarcode() async {
+    try {
+      await _methodChannel.invokeMethod('scanBarcode');
+    } on PlatformException catch (e) {
+      print("扫描失败: ${e.message}");
+    }
+  }
+
+  /// 读取RFID
+  Future<String?> readRfid() async {
+    try {
+      final String? rfid = await _methodChannel.invokeMethod('readRfid');
+      return rfid;
+    } on PlatformException catch (e) {
+      print("读取RFID失败: ${e.message}");
+      return null;
+    }
+  }
+
+  /// 写入RFID
+  Future<String?> writeRfid(String data) async {
+    try {
+      final String? result = await _methodChannel.invokeMethod('writeRfid', {
+        'data': data,
+      });
+      return result;
+    } on PlatformException catch (e) {
+      print("写入RFID失败: ${e.message}");
+      return null;
+    }
+  }
+
+  /// 监听扫描结果
+  Stream<String?> get scanResults => _scanResultController.stream;
+
+  /// 开始监听扫描结果
+  void startListeningScanResults() {
+    _scanSubscription = _eventChannel.receiveBroadcastStream().listen(
+      (dynamic result) {
+        _scanResultController.sink.add(result as String?);
+      },
+      onError: (dynamic error) {
+        print("接收扫描结果出错: $error");
+        _scanResultController.sink.add(null);
+      },
+    );
+  }
+
+  /// 停止监听扫描结果
+  void stopListeningScanResults() {
+    _scanSubscription?.cancel();
+    _scanSubscription = null;
+  }
+
+  /// 释放资源
+  void dispose() {
+    stopListeningScanResults();
+    _scanResultController.close();
+  }
+}

+ 173 - 0
UI/CF.APP/chicken_farm/lib/widgets/pda_demo_page.dart

@@ -0,0 +1,173 @@
+import 'package:flutter/material.dart';
+import 'package:chicken_farm/services/pda_service.dart';
+
+class PdaDemoPage extends StatefulWidget {
+  const PdaDemoPage({Key? key}) : super(key: key);
+
+  @override
+  State<PdaDemoPage> createState() => _PdaDemoPageState();
+}
+
+class _PdaDemoPageState extends State<PdaDemoPage> {
+  final PdaService _pdaService = PdaService();
+  String? _scanResult;
+  String? _rfidResult;
+  bool _isScanning = false;
+
+  @override
+  void initState() {
+    super.initState();
+    // 开始监听扫描结果
+    _pdaService.startListeningScanResults();
+    // 监听扫描结果流
+    _pdaService.scanResults.listen((result) {
+      setState(() {
+        _scanResult = result;
+        _isScanning = false;
+      });
+    });
+  }
+
+  @override
+  void dispose() {
+    // 停止监听扫描结果
+    _pdaService.stopListeningScanResults();
+    super.dispose();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: const Text('PDA功能演示'),
+      ),
+      body: Padding(
+        padding: const EdgeInsets.all(16.0),
+        child: Column(
+          crossAxisAlignment: CrossAxisAlignment.stretch,
+          children: [
+            // 扫描功能区域
+            Card(
+              child: Padding(
+                padding: const EdgeInsets.all(16.0),
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.stretch,
+                  children: [
+                    const Text(
+                      '条码扫描',
+                      style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
+                    ),
+                    const SizedBox(height: 16),
+                    ElevatedButton(
+                      onPressed: _isScanning
+                          ? null
+                          : () {
+                              setState(() {
+                                _isScanning = true;
+                                _scanResult = null;
+                              });
+                              _pdaService.scanBarcode();
+                            },
+                      child: _isScanning
+                          ? const Row(
+                              mainAxisAlignment: MainAxisAlignment.center,
+                              children: [
+                                SizedBox(
+                                  width: 20,
+                                  height: 20,
+                                  child: CircularProgressIndicator(
+                                    strokeWidth: 2,
+                                    valueColor:
+                                        AlwaysStoppedAnimation<Color>(Colors.white),
+                                  ),
+                                ),
+                                SizedBox(width: 10),
+                                Text('扫描中...')
+                              ],
+                            )
+                          : const Text('触发扫描'),
+                    ),
+                    const SizedBox(height: 16),
+                    const Text('扫描结果:'),
+                    const SizedBox(height: 8),
+                    Container(
+                      padding: const EdgeInsets.all(12),
+                      decoration: BoxDecoration(
+                        border: Border.all(color: Colors.grey),
+                        borderRadius: BorderRadius.circular(4),
+                      ),
+                      child: Text(
+                        _scanResult ?? '暂无扫描结果',
+                        style: TextStyle(
+                          color: _scanResult == null ? Colors.grey : Colors.black,
+                        ),
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+            ),
+            const SizedBox(height: 20),
+            // RFID功能区域
+            Card(
+              child: Padding(
+                padding: const EdgeInsets.all(16.0),
+                child: Column(
+                  crossAxisAlignment: CrossAxisAlignment.stretch,
+                  children: [
+                    const Text(
+                      'RFID读写',
+                      style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
+                    ),
+                    const SizedBox(height: 16),
+                    ElevatedButton(
+                      onPressed: () async {
+                        setState(() {
+                          _rfidResult = null;
+                        });
+                        final rfid = await _pdaService.readRfid();
+                        setState(() {
+                          _rfidResult = rfid;
+                        });
+                      },
+                      child: const Text('读取RFID'),
+                    ),
+                    const SizedBox(height: 16),
+                    ElevatedButton(
+                      onPressed: () async {
+                        setState(() {
+                          _rfidResult = null;
+                        });
+                        final result = await _pdaService.writeRfid('TestData123');
+                        setState(() {
+                          _rfidResult = result;
+                        });
+                      },
+                      child: const Text('写入RFID'),
+                    ),
+                    const SizedBox(height: 16),
+                    const Text('RFID结果:'),
+                    const SizedBox(height: 8),
+                    Container(
+                      padding: const EdgeInsets.all(12),
+                      decoration: BoxDecoration(
+                        border: Border.all(color: Colors.grey),
+                        borderRadius: BorderRadius.circular(4),
+                      ),
+                      child: Text(
+                        _rfidResult ?? '暂无RFID结果',
+                        style: TextStyle(
+                          color: _rfidResult == null ? Colors.grey : Colors.black,
+                        ),
+                      ),
+                    ),
+                  ],
+                ),
+              ),
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}

+ 2 - 0
UI/CF.APP/chicken_farm/macos/Flutter/GeneratedPluginRegistrant.swift

@@ -6,6 +6,7 @@ import FlutterMacOS
 import Foundation
 
 import audioplayers_darwin
+import connectivity_plus
 import file_selector_macos
 import flutter_image_compress_macos
 import mobile_scanner
@@ -14,6 +15,7 @@ import shared_preferences_foundation
 
 func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
   AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin"))
+  ConnectivityPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlugin"))
   FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
   FlutterImageCompressMacosPlugin.register(with: registry.registrar(forPlugin: "FlutterImageCompressMacosPlugin"))
   MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin"))

+ 3 - 0
UI/CF.APP/chicken_farm/windows/flutter/generated_plugin_registrant.cc

@@ -7,11 +7,14 @@
 #include "generated_plugin_registrant.h"
 
 #include <audioplayers_windows/audioplayers_windows_plugin.h>
+#include <connectivity_plus/connectivity_plus_windows_plugin.h>
 #include <file_selector_windows/file_selector_windows.h>
 
 void RegisterPlugins(flutter::PluginRegistry* registry) {
   AudioplayersWindowsPluginRegisterWithRegistrar(
       registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin"));
+  ConnectivityPlusWindowsPluginRegisterWithRegistrar(
+      registry->GetRegistrarForPlugin("ConnectivityPlusWindowsPlugin"));
   FileSelectorWindowsRegisterWithRegistrar(
       registry->GetRegistrarForPlugin("FileSelectorWindows"));
 }

+ 1 - 0
UI/CF.APP/chicken_farm/windows/flutter/generated_plugins.cmake

@@ -4,6 +4,7 @@
 
 list(APPEND FLUTTER_PLUGIN_LIST
   audioplayers_windows
+  connectivity_plus
   file_selector_windows
 )