Compare commits

..

No commits in common. "c27eff04624818773216a7b203b6c1b3d1f072fb" and "88fb2fd17afe339c10af9921c6ddddabd311cb6d" have entirely different histories.

70 changed files with 1025 additions and 2141 deletions

2
.gitignore vendored
View File

@ -53,5 +53,3 @@ making_school_asignment_app/lib/common/api/retrofit_client.g.dart
making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart making_school_asignment_app/lib/page/home_page/children/read_over/read_over_view.g.dart
.vscode/settings.json .vscode/settings.json
.vscode/launch.json .vscode/launch.json
making_school_asignment_app/.fvm/fvm_config.json
making_school_asignment_app/.fvm/flutter_sdk

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 B

After

Width:  |  Height:  |  Size: 305 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 B

After

Width:  |  Height:  |  Size: 305 KiB

View File

@ -6,7 +6,6 @@
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item> <item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#eeeeee</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item> <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.

View File

@ -6,7 +6,6 @@
<item name="android:windowFullscreen">false</item> <item name="android:windowFullscreen">false</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item> <item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item> <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
<item name="android:windowSplashScreenBackground">#eeeeee</item>
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item> <item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
</style> </style>
<!-- Theme applied to the Android Window as soon as the process has started. <!-- Theme applied to the Android Window as soon as the process has started.

View File

@ -29,7 +29,7 @@
type="application/octet-stream" /> type="application/octet-stream" />
</item> --> </item> -->
<item> <item>
<title>Version 1.0.1+2</title> <title>Version 1.0.0</title>
#发行说明-读取html方式(2选1) #发行说明-读取html方式(2选1)
<!-- <sparkle:releaseNotesLink> <!-- <sparkle:releaseNotesLink>
https://your_domain/your_path/release_notes.html https://your_domain/your_path/release_notes.html
@ -38,16 +38,16 @@
<description> <description>
<![CDATA[ <![CDATA[
<ul> <ul>
<li>1、优化批阅提示</li> <li>1、新增XX功能</li>
<li>2、优化启动图和展示页面</li> <li>2、新增XX功能</li>
</ul> </ul>
]]> ]]>
</description> </description>
<pubDate>Sun, 16 Feb 2024 12:00:00 +0800</pubDate> <pubDate>Sun, 16 Feb 2022 12:00:00 +0800</pubDate>
#你更新程序的地址 #你更新程序的地址
<enclosure url="https://dpc-job-oss.23544.com/infra-app/making_school_asignment_app/1.0.1/3/making_school_asignment_app-1.0.1+2-windows-setup.exe" <enclosure url="https://dpc-job-oss.23544.com/infra-app/making_school_asignment_app/1.0.0/3/making_school_asignment_app-1.0.0+1-windows-setup.exe"
sparkle:dsaSignature="MEUCIG2O7ZNPeIs/fi2GF/UCRvooqIZMFjLPyfGsIqTnmfHkAiEAuFusRpYjkf05fqBv3nQqfyy8Y8u6ub5X+QWZU7NJ5qU=" sparkle:dsaSignature="MEUCICOob1N5PNhjRDWh2gHHOuJayep41hP+BMyF26BoYjQLAiEA2dG22KMc2HCQTUyWe1pxWmCJqVmdNQU+Mmfvojg0K2M="
sparkle:version="1.0.1+2" sparkle:version="1.0.0+1"
sparkle:os="windows" sparkle:os="windows"
length="0" length="0"
type="application/octet-stream" /> type="application/octet-stream" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 301 KiB

View File

@ -5,9 +5,7 @@ flutter_native_splash:
# 如需恢复默认的白屏,执行如下命令 # 如需恢复默认的白屏,执行如下命令
# flutter pub run flutter_native_splash:remove # flutter pub run flutter_native_splash:remove
# 设置闪屏页的默认态logo或背景图片路径 # 设置闪屏页的默认态logo或背景图片路径
color: "#eeeeee" background_image: assets/images/splash_native.png
image_ios: assets/images/splash_native.png
background_image_android: assets/images/splash_native.png
android_12: android_12:
image: assets/images/splash.png image: assets/images/splash.png
android: true android: true

View File

@ -43,8 +43,6 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
02826AB13A0419EF6A6BEE4C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 02826AB13A0419EF6A6BEE4C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
0B2C69D12C734FA600ABD561 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
0B2C69D22C743A7D00ABD561 /* RunnerRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerRelease.entitlements; sourceTree = "<group>"; };
12C576EE23C708825E0F6031 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; }; 12C576EE23C708825E0F6031 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
@ -99,6 +97,7 @@
20D60590541077F4B12F8462 /* Pods-RunnerTests.release.xcconfig */, 20D60590541077F4B12F8462 /* Pods-RunnerTests.release.xcconfig */,
168BD706454188B9AD4262F4 /* Pods-RunnerTests.profile.xcconfig */, 168BD706454188B9AD4262F4 /* Pods-RunnerTests.profile.xcconfig */,
); );
name = Pods;
path = Pods; path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -145,8 +144,6 @@
97C146F01CF9000F007C117D /* Runner */ = { 97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
0B2C69D22C743A7D00ABD561 /* RunnerRelease.entitlements */,
0B2C69D12C734FA600ABD561 /* Runner.entitlements */,
97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
@ -457,7 +454,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -492,28 +488,17 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = Z778GC45N8;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp;
PRODUCT_BUNDLE_IDENTIFIER = "com.yuanxuan.makingS--buneng--choolAsignmentApp";
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Profile; name = Profile;
@ -543,7 +528,6 @@
BUNDLE_LOADER = "$(TEST_HOST)"; BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1; CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = Z778GC45N8;
GENERATE_INFOPLIST_FILE = YES; GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0; MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp.RunnerTests; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp.RunnerTests;
@ -593,7 +577,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -651,7 +634,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -688,26 +670,18 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = Z778GC45N8;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1;
PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Debug; name = Debug;
@ -718,25 +692,17 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = Z778GC45N8;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
MARKETING_VERSION = 1;
PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp; PRODUCT_BUNDLE_IDENTIFIER = com.yuanxuan.makingSchoolAsignmentApp;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Release; name = Release;

View File

@ -1,122 +1,122 @@
{ {
"images": [ "images" : [
{ {
"filename": "Icon-App-20x20@2x.png", "size" : "20x20",
"idiom": "iphone", "idiom" : "iphone",
"scale": "2x", "filename" : "Icon-App-20x20@2x.png",
"size": "20x20" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-20x20@3x.png", "size" : "20x20",
"idiom": "iphone", "idiom" : "iphone",
"scale": "3x", "filename" : "Icon-App-20x20@3x.png",
"size": "20x20" "scale" : "3x"
}, },
{ {
"filename": "Icon-App-29x29@1x.png", "size" : "29x29",
"idiom": "iphone", "idiom" : "iphone",
"scale": "1x", "filename" : "Icon-App-29x29@1x.png",
"size": "29x29" "scale" : "1x"
}, },
{ {
"filename": "Icon-App-29x29@2x.png", "size" : "29x29",
"idiom": "iphone", "idiom" : "iphone",
"scale": "2x", "filename" : "Icon-App-29x29@2x.png",
"size": "29x29" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-29x29@3x.png", "size" : "29x29",
"idiom": "iphone", "idiom" : "iphone",
"scale": "3x", "filename" : "Icon-App-29x29@3x.png",
"size": "29x29" "scale" : "3x"
}, },
{ {
"filename": "Icon-App-40x40@2x.png", "size" : "40x40",
"idiom": "iphone", "idiom" : "iphone",
"scale": "2x", "filename" : "Icon-App-40x40@2x.png",
"size": "40x40" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-40x40@3x.png", "size" : "40x40",
"idiom": "iphone", "idiom" : "iphone",
"scale": "3x", "filename" : "Icon-App-40x40@3x.png",
"size": "40x40" "scale" : "3x"
}, },
{ {
"filename": "Icon-App-60x60@2x.png", "size" : "60x60",
"idiom": "iphone", "idiom" : "iphone",
"scale": "2x", "filename" : "Icon-App-60x60@2x.png",
"size": "60x60" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-60x60@3x.png", "size" : "60x60",
"idiom": "iphone", "idiom" : "iphone",
"scale": "3x", "filename" : "Icon-App-60x60@3x.png",
"size": "60x60" "scale" : "3x"
}, },
{ {
"filename": "Icon-App-20x20@1x.png", "size" : "20x20",
"idiom": "ipad", "idiom" : "ipad",
"scale": "1x", "filename" : "Icon-App-20x20@1x.png",
"size": "20x20" "scale" : "1x"
}, },
{ {
"filename": "Icon-App-20x20@2x.png", "size" : "20x20",
"idiom": "ipad", "idiom" : "ipad",
"scale": "2x", "filename" : "Icon-App-20x20@2x.png",
"size": "20x20" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-29x29@1x.png", "size" : "29x29",
"idiom": "ipad", "idiom" : "ipad",
"scale": "1x", "filename" : "Icon-App-29x29@1x.png",
"size": "29x29" "scale" : "1x"
}, },
{ {
"filename": "Icon-App-29x29@2x.png", "size" : "29x29",
"idiom": "ipad", "idiom" : "ipad",
"scale": "2x", "filename" : "Icon-App-29x29@2x.png",
"size": "29x29" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-40x40@1x.png", "size" : "40x40",
"idiom": "ipad", "idiom" : "ipad",
"scale": "1x", "filename" : "Icon-App-40x40@1x.png",
"size": "40x40" "scale" : "1x"
}, },
{ {
"filename": "Icon-App-40x40@2x.png", "size" : "40x40",
"idiom": "ipad", "idiom" : "ipad",
"scale": "2x", "filename" : "Icon-App-40x40@2x.png",
"size": "40x40" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-76x76@1x.png", "size" : "76x76",
"idiom": "ipad", "idiom" : "ipad",
"scale": "1x", "filename" : "Icon-App-76x76@1x.png",
"size": "76x76" "scale" : "1x"
}, },
{ {
"filename": "Icon-App-76x76@2x.png", "size" : "76x76",
"idiom": "ipad", "idiom" : "ipad",
"scale": "2x", "filename" : "Icon-App-76x76@2x.png",
"size": "76x76" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-83.5x83.5@2x.png", "size" : "83.5x83.5",
"idiom": "ipad", "idiom" : "ipad",
"scale": "2x", "filename" : "Icon-App-83.5x83.5@2x.png",
"size": "83.5x83.5" "scale" : "2x"
}, },
{ {
"filename": "Icon-App-1024x1024@1x.png", "size" : "1024x1024",
"idiom": "ios-marketing", "idiom" : "ios-marketing",
"scale": "1x", "filename" : "Icon-App-1024x1024@1x.png",
"size": "1024x1024" "scale" : "1x"
} }
], ],
"info": { "info" : {
"author": "icons_launcher", "version" : 1,
"version": 1 "author" : "xcode"
} }
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 635 B

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 961 B

After

Width:  |  Height:  |  Size: 956 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,6 +0,0 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -1,21 +0,0 @@
{
"images" : [
{
"filename" : "background.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 69 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

After

Width:  |  Height:  |  Size: 69 B

View File

@ -0,0 +1,5 @@
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.

View File

@ -38,7 +38,7 @@
</scene> </scene>
</scenes> </scenes>
<resources> <resources>
<image name="LaunchImage" width="750" height="1735"/> <image name="LaunchImage" width="168" height="185"/>
<image name="LaunchBackground" width="1" height="1"/> <image name="LaunchBackground" width="1" height="1"/>
</resources> </resources>
</document> </document>

View File

@ -1,10 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22685"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
<!--Flutter View Controller--> <!--Flutter View Controller-->
@ -16,14 +14,13 @@
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides> </layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/> <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view> </view>
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="55" y="-34"/>
</scene> </scene>
</scenes> </scenes>
</document> </document>

View File

@ -2,12 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>点智学</string> <string>Making School Asignment App</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@ -26,19 +24,10 @@
<string>$(FLUTTER_BUILD_NUMBER)</string> <string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict/>
</dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIMainStoryboardFile</key> <key>UIMainStoryboardFile</key>
<string>Main</string> <string>Main</string>
<key>UIStatusBarHidden</key>
<false/>
<key>UISupportedInterfaceOrientations</key> <key>UISupportedInterfaceOrientations</key>
<array> <array>
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
@ -52,6 +41,12 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UIStatusBarHidden</key>
<false/>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
</dict> </dict>

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array/>
<key>com.apple.developer.devicecheck.appattest-environment</key>
<string>development</string>
<key>com.apple.developer.networking.networkextension</key>
<array/>
<key>com.apple.developer.networking.slicing.appcategory</key>
<array/>
<key>com.apple.developer.networking.slicing.trafficcategory</key>
<array/>
<key>com.apple.developer.networking.wifi-info</key>
<true/>
<key>com.apple.developer.user-fonts</key>
<array/>
<key>com.apple.security.application-groups</key>
<array/>
</dict>
</plist>

View File

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.associated-domains</key>
<array/>
<key>com.apple.developer.devicecheck.appattest-environment</key>
<string>development</string>
<key>com.apple.developer.networking.networkextension</key>
<array/>
<key>com.apple.developer.networking.slicing.appcategory</key>
<array/>
<key>com.apple.developer.networking.slicing.trafficcategory</key>
<array/>
<key>com.apple.developer.networking.wifi-info</key>
<true/>
<key>com.apple.developer.user-fonts</key>
<array/>
<key>com.apple.security.application-groups</key>
<array/>
</dict>
</plist>

View File

@ -5,7 +5,6 @@ import 'package:making_school_asignment_app/common/job/marking_models/do_paper_d
import 'package:making_school_asignment_app/common/job/marking_models/favor_param.dart'; import 'package:making_school_asignment_app/common/job/marking_models/favor_param.dart';
import 'package:making_school_asignment_app/common/job/marking_models/original_manuscript_handwriting_params.dart'; import 'package:making_school_asignment_app/common/job/marking_models/original_manuscript_handwriting_params.dart';
import 'package:making_school_asignment_app/common/job/marking_models/review_submission_params.dart'; import 'package:making_school_asignment_app/common/job/marking_models/review_submission_params.dart';
import 'package:making_school_asignment_app/common/job/user_register_params.dart';
import 'package:making_school_asignment_app/page/home_page/children/homework_review/components/job_handwriting.dart'; import 'package:making_school_asignment_app/page/home_page/children/homework_review/components/job_handwriting.dart';
import 'package:retrofit/retrofit.dart'; import 'package:retrofit/retrofit.dart';
import 'package:making_school_asignment_app/common/job/annotated_class.dart'; import 'package:making_school_asignment_app/common/job/annotated_class.dart';
@ -41,12 +40,6 @@ abstract class RetrofitClient {
@POST("/api/rbac/Auth/DcLogin") @POST("/api/rbac/Auth/DcLogin")
Future toLogin(@Field() String account, @Field() String password); Future toLogin(@Field() String account, @Field() String password);
@POST("/api/rbac/Auth/Register")
Future<String> toRegister(@Body() UserRegisterParams params);
@DELETE("/api/rbac/User/Delete")
Future<String> toUserLogout(@Field() int id);
@GET("/api/rbac/User/GetUser") @GET("/api/rbac/User/GetUser")
Future<UserInfoDetail?> getUser(@Query('userId') String userId); Future<UserInfoDetail?> getUser(@Query('userId') String userId);

View File

@ -27,8 +27,8 @@ class AppVersion extends Object {
@JsonKey(name: 'ftuType') @JsonKey(name: 'ftuType')
int ftuType; int ftuType;
@JsonKey(name: 'appFileUrl') @JsonKey(name: 'downloadUrl')
String? appFileUrl; String? downloadUrl;
@JsonKey(name: 'description') @JsonKey(name: 'description')
String? description; String? description;
@ -41,10 +41,10 @@ class AppVersion extends Object {
this.appName, this.appName,
this.version, this.version,
this.ftuType, this.ftuType,
this.appFileUrl, this.downloadUrl,
this.description, this.description,
) { ) {
if (appFileUrl != null) appFileUrl = RequestConfig.imgUrl + appFileUrl!; if (downloadUrl != null) downloadUrl = RequestConfig.imgUrl + downloadUrl!;
} }
factory AppVersion.fromJson(Map<String, dynamic> srcJson) => _$AppVersionFromJson(srcJson); factory AppVersion.fromJson(Map<String, dynamic> srcJson) => _$AppVersionFromJson(srcJson);

View File

@ -1,4 +1,5 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:get/get_connect/http/src/request/request.dart';
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:making_school_asignment_app/common/config/request_config.dart'; import 'package:making_school_asignment_app/common/config/request_config.dart';
@ -72,9 +73,6 @@ class DoPaperDetailsResult extends Object {
@JsonKey(name: 'totalUnAnnotateCount') @JsonKey(name: 'totalUnAnnotateCount')
int totalUnAnnotateCount; int totalUnAnnotateCount;
@JsonKey(name: 'needAnnotate') //
bool needAnnotate;
DoPaperDetailsResult( DoPaperDetailsResult(
this.totalUnAnnotateCount, this.totalUnAnnotateCount,
this.templateIds, this.templateIds,
@ -96,7 +94,7 @@ class DoPaperDetailsResult extends Object {
this.priority, this.priority,
this.annotateTime, this.annotateTime,
this.showZgtAnnotate, this.showZgtAnnotate,
{this.needAnnotate = false}) { ) {
if (templateIds.keys.isNotEmpty) { if (templateIds.keys.isNotEmpty) {
templateIdKeys = templateIds.keys.map((e) => int.parse(e)).toList(); templateIdKeys = templateIds.keys.map((e) => int.parse(e)).toList();
templateIdKeyMap = <int, int>{}; templateIdKeyMap = <int, int>{};
@ -116,21 +114,14 @@ class DoPaperDetailsResult extends Object {
if (zgtAnnotate?.isNotEmpty ?? false) { if (zgtAnnotate?.isNotEmpty ?? false) {
showZgtAnnotate = RequestConfig.imgUrl + zgtAnnotate!; // showZgtAnnotate = RequestConfig.imgUrl + zgtAnnotate!; //
if (annotateTime != null) if (annotateTime != null) showZgtAnnotate = '${showZgtAnnotate!}?$annotateTime';
showZgtAnnotate = '${showZgtAnnotate!}?$annotateTime';
} }
//
if (annotateTime == null ||
studentQuestions.indexWhere((e) => e.studentScore == null) != -1) {
needAnnotate = true;
}
// print('学生作答图片:${annotatedCount}'); // print('学生作答图片:${annotatedCount}');
// print('老师批注图片提交数量:${submitCount}'); // print('老师批注图片提交数量:${submitCount}');
} }
factory DoPaperDetailsResult.fromJson(Map<String, dynamic> srcJson) => factory DoPaperDetailsResult.fromJson(Map<String, dynamic> srcJson) => _$DoPaperDetailsResultFromJson(srcJson);
_$DoPaperDetailsResultFromJson(srcJson);
Map<String, dynamic> toJson() => _$DoPaperDetailsResultToJson(this); Map<String, dynamic> toJson() => _$DoPaperDetailsResultToJson(this);
} }
@ -153,8 +144,7 @@ class PaperStudents extends Object {
this.isPriority, this.isPriority,
); );
factory PaperStudents.fromJson(Map<String, dynamic> srcJson) => factory PaperStudents.fromJson(Map<String, dynamic> srcJson) => _$PaperStudentsFromJson(srcJson);
_$PaperStudentsFromJson(srcJson);
Map<String, dynamic> toJson() => _$PaperStudentsToJson(this); Map<String, dynamic> toJson() => _$PaperStudentsToJson(this);
} }
@ -202,8 +192,7 @@ class StudentQuestions extends Object {
this.isCorrect, this.isCorrect,
}); });
factory StudentQuestions.fromJson(Map<String, dynamic> srcJson) => factory StudentQuestions.fromJson(Map<String, dynamic> srcJson) => _$StudentQuestionsFromJson(srcJson);
_$StudentQuestionsFromJson(srcJson);
Map<String, dynamic> toJson() => _$StudentQuestionsToJson(this); Map<String, dynamic> toJson() => _$StudentQuestionsToJson(this);
} }
@ -221,8 +210,7 @@ class LastPage extends Object {
this.studentId, this.studentId,
); );
factory LastPage.fromJson(Map<String, dynamic> srcJson) => factory LastPage.fromJson(Map<String, dynamic> srcJson) => _$LastPageFromJson(srcJson);
_$LastPageFromJson(srcJson);
Map<String, dynamic> toJson() => _$LastPageToJson(this); Map<String, dynamic> toJson() => _$LastPageToJson(this);
} }
@ -240,8 +228,7 @@ class NextPage extends Object {
this.studentId, this.studentId,
); );
factory NextPage.fromJson(Map<String, dynamic> srcJson) => factory NextPage.fromJson(Map<String, dynamic> srcJson) => _$NextPageFromJson(srcJson);
_$NextPageFromJson(srcJson);
Map<String, dynamic> toJson() => _$NextPageToJson(this); Map<String, dynamic> toJson() => _$NextPageToJson(this);
} }

View File

@ -1,21 +0,0 @@
import 'package:json_annotation/json_annotation.dart';
part 'user_register_params.g.dart';
@JsonSerializable()
class UserRegisterParams extends Object {
@JsonKey(name: 'account')
String account;
@JsonKey(name: 'password')
String password;
UserRegisterParams({
required this.account,
required this.password,
});
factory UserRegisterParams.fromJson(Map<String, dynamic> srcJson) => _$UserRegisterParamsFromJson(srcJson);
Map<String, dynamic> toJson() => _$UserRegisterParamsToJson(this);
}

View File

@ -160,16 +160,6 @@ class TheError extends Interceptor {
int? statusCode = response.statusCode; int? statusCode = response.statusCode;
var errorMap = response.data; var errorMap = response.data;
if (errorMap is String && errorMap.length > 0) {
try {
var errorModel = jsonDecode(errorMap);
var error = errorModel['error'];
if (error != null && error["message"] != null) {
message = error["message"];
}
} catch (e) {}
}
// var runtimeType = errorMap.runtimeType; // var runtimeType = errorMap.runtimeType;
if (errorMap is Map && errorMap['error'] != null) { if (errorMap is Map && errorMap['error'] != null) {
message = errorMap['error']?['message'] ?? '请求错误,请重试'; message = errorMap['error']?['message'] ?? '请求错误,请重试';
@ -208,7 +198,7 @@ class TheError extends Interceptor {
if (message == '用户登录失效,请重新登录' && userInfo.value?.id == null) { if (message == '用户登录失效,请重新登录' && userInfo.value?.id == null) {
return handler.next(error); return handler.next(error);
} }
Future.delayed(const Duration(milliseconds: 600), () => ToastUtils.showError(message)); ToastUtils.showError(message);
return handler.next(error); return handler.next(error);
} }
} }

View File

@ -7,8 +7,7 @@ enum AppStorageKey {
userInfo(value: 'USERINFO', label: "登录用户的基本信息 及 token过期时间"), userInfo(value: 'USERINFO', label: "登录用户的基本信息 及 token过期时间"),
userDetailInfo(value: 'USERDETAILINFO', label: "用户的详细信息"), userDetailInfo(value: 'USERDETAILINFO', label: "用户的详细信息"),
account(value: 'ACCOUNT', label: "用户名"), account(value: 'ACCOUNT', label: "用户名"),
pwd(value: 'PWD', label: "密码"), pwd(value: 'PWD', label: "密码");
privacyAgreement(value: 'PRIVACYAGREEMENT', label: "用户同意隐私协议");
final String label; final String label;
final String value; final String value;

View File

@ -51,7 +51,7 @@ class UpgradeLogic extends GetxController with RequestToolMixin {
// String buildNumber = packageInfo.buildNumber; // // String buildNumber = packageInfo.buildNumber; //
Map json = { Map json = {
'downloadPath': Platform.isWindows ? '' : result.appFileUrl, 'downloadPath': Platform.isWindows ? '' : result.downloadUrl,
'version': result.version, 'version': result.version,
'systemType': deviceType, 'systemType': deviceType,
'description': result.description ?? 'APP新版本更新' 'description': result.description ?? 'APP新版本更新'

View File

@ -12,6 +12,7 @@ import 'package:making_school_asignment_app/common/utils/storage.dart';
import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart';
import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:permission_handler/permission_handler.dart';
import 'common/config/request_config.dart'; import 'common/config/request_config.dart';
import 'common/utils/app_upgrade/upgradeLogic.dart'; import 'common/utils/app_upgrade/upgradeLogic.dart';
@ -22,7 +23,6 @@ void main() async {
Get.testMode = true; Get.testMode = true;
WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized(); WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
/// ///
await Get.putAsync(() => StorageService().init()); await Get.putAsync(() => StorageService().init());
@ -41,11 +41,13 @@ void main() async {
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarColor: Colors.transparent, // statusBarColor: Colors.transparent, //
statusBarIconBrightness: Brightness.light // dark: light statusBarIconBrightness: Brightness.dark // dark: light
)); ));
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]); // SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]); //
await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); // await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp, DeviceOrientation.portraitDown]); //
runApp(const MyApp()); runApp(const MyApp());
Permission.storage.request();
} }
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {

View File

@ -2,10 +2,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:making_school_asignment_app/common/const_text.dart'; import 'package:making_school_asignment_app/common/const_text.dart';
import 'package:making_school_asignment_app/common/job/user_info_detail.dart';
import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart';
import 'package:making_school_asignment_app/common/store/user_store.dart';
import 'package:making_school_asignment_app/common/utils/storage.dart';
import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
@ -18,8 +14,7 @@ class OhterPage extends StatefulWidget {
State<OhterPage> createState() => _OhterPageState(); State<OhterPage> createState() => _OhterPageState();
} }
class _OhterPageState extends State<OhterPage> with RequestToolMixin { class _OhterPageState extends State<OhterPage> {
late Rx<UserInfoDetail?> userInfo = UserStore.to.userDetailInfo;
RxString localVersion = ''.obs; RxString localVersion = ''.obs;
@override @override
@ -34,48 +29,16 @@ class _OhterPageState extends State<OhterPage> with RequestToolMixin {
localVersion.value = packageInfo.version; localVersion.value = packageInfo.version;
} }
//
_showAlertDialog(context1) async {
await showDialog(
//
barrierDismissible: false,
context: context1,
builder: (context) {
return AlertDialog(title: quickText("提示信息"), content: quickText("账户注销无法恢复,您确定要注销账户吗?"), actions: <Widget>[
TextButton(
child: quickText("取消"),
onPressed: () {
Navigator.pop(context, 'Cancle');
},
),
TextButton(
child: quickText("确定"),
onPressed: () async {
/* ref.read(markingKeyboardProvider.notifier).clean();
ref.read(markingSubtopicSwitchingProvider.notifier).clean();
ref.read(userTokenProvider.notifier).clean();
ref.read(userProvider.notifier).clean();*/
await getClient().toUserLogout(userInfo.value!.id);
try {
UserStore.to.erase();
var msg = await StorageService.to.erase();
print(msg);
Navigator.pop(context, "Ok");
Get.offAllNamed(Routes.login);
} catch (e) {
print(e);
}
})
]);
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final personalInfoTitleStly = TextStyle( final personalInfoTitleStly = TextStyle(
color: const Color.fromRGBO(80, 87, 103, 1), color: const Color.fromRGBO(80, 87, 103, 1),
fontSize: 16.sp, fontSize: 16.sp,
); );
final personalInfoValStly = TextStyle(
color: const Color.fromRGBO(148, 163, 182, 1),
fontSize: 16.sp,
);
return Scaffold( return Scaffold(
backgroundColor: const Color.fromRGBO(248, 248, 248, 1), backgroundColor: const Color.fromRGBO(248, 248, 248, 1),
@ -145,53 +108,10 @@ class _OhterPageState extends State<OhterPage> with RequestToolMixin {
), ),
], ],
), ),
Positioned(
bottom: 50.h,
child: InkWell(
child: Container(
height: 46.h,
width: ScreenUtil().screenWidth - 60.w,
padding: EdgeInsets.symmetric(vertical: 14.h),
decoration: BoxDecoration(
borderRadius: BorderRadius.all(
Radius.circular(6.w),
),
color: Colors.white,
boxShadow: [
BoxShadow(
color: const Color.fromRGBO(46, 91, 255, 0.2),
offset: Offset(2.w, 2.h), //y轴偏移量
blurRadius: 14, //
spreadRadius: 0.5, //
)
],
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.exit_to_app_outlined,
size: 13.sp,
color: const Color.fromRGBO(148, 163, 182, 1),
),
Container(
width: 6.w,
),
Text(
'账户注销',
style: TextStyle(color: const Color.fromRGBO(148, 163, 182, 1), fontSize: 13.sp),
),
],
),
),
onTap: () => _showAlertDialog(context),
),
),
Row( Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [Text('APP备案号: ', style: personalInfoTitleStly), quickText('渝ICP备17007225号-4A', size: 14.sp)], children: [Text('APP备案号: ', style: personalInfoTitleStly), quickText('渝ICP备17007225号-3A', size: 14.sp)],
), ),
], ],
)); ));

View File

@ -1,8 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:app_settings/app_settings.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart'; import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -19,7 +17,6 @@ import 'package:making_school_asignment_app/page/home_page/home_view.dart';
import 'package:making_school_asignment_app/page/work_page/work_logic.dart'; import 'package:making_school_asignment_app/page/work_page/work_logic.dart';
import 'package:making_school_asignment_app/page/work_page/work_view.dart'; import 'package:making_school_asignment_app/page/work_page/work_view.dart';
import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart';
import 'package:permission_handler/permission_handler.dart';
class StartPage extends StatefulWidget { class StartPage extends StatefulWidget {
const StartPage({super.key}); const StartPage({super.key});
@ -30,73 +27,16 @@ class StartPage extends StatefulWidget {
class _StartPageState extends State<StartPage> with RequestToolMixin { class _StartPageState extends State<StartPage> with RequestToolMixin {
Timer? _timer; Timer? _timer;
Timer? _timerPermission;
DateTime? lastPopTime; DateTime? lastPopTime;
final _pageController = Get.find<PageIndexController>(); final _pageController = Get.find<PageIndexController>();
final _upgradeLogic = Get.find<UpgradeLogic>(); final _upgradeLogic = Get.find<UpgradeLogic>();
late final List<Widget> _bodyList; late final List<Widget> _bodyList;
void getStoragePermission() async {
_timerPermission?.cancel();
_timerPermission = null;
var status = await Permission.storage.status;
if (status != PermissionStatus.granted) {
print(status);
if (status == PermissionStatus.denied) {
await showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text("权限拒绝"),
content: Text("权限被永久拒绝,请前往权限设置页面通过权限"),
actions: [
ElevatedButton(
onPressed: () async {
await AppSettings.openAppSettings(asAnotherTask: true);
Navigator.of(context).pop();
_timerPermission = Timer.periodic(const Duration(seconds: 30), (_) => getStoragePermission());
},
child: Text('前往'),
)
],
);
},
);
return;
}
await showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return AlertDialog(
title: Text("内存权限"),
content: Text("为了提供更好的服务,需要获取到存储权限用于保存批阅笔记"),
actions: [
ElevatedButton(
onPressed: () async {
await Permission.storage.request();
Navigator.of(context).pop();
getStoragePermission();
},
child: Text('允许'),
)
],
);
},
);
}
}
@override @override
void initState() { void initState() {
super.initState(); super.initState();
FlutterNativeSplash.remove();
Future.delayed(const Duration(seconds: 3), () => FlutterNativeSplash.remove());
Future.delayed(const Duration(seconds: 4), () => getStoragePermission());
Get.put(HomeLogic()); Get.put(HomeLogic());
Get.put(WorkLogic()); Get.put(WorkLogic());
@ -132,7 +72,6 @@ class _StartPageState extends State<StartPage> with RequestToolMixin {
void dispose() { void dispose() {
Get.delete<PageIndexController>(); Get.delete<PageIndexController>();
_timer?.cancel(); _timer?.cancel();
_timerPermission?.cancel();
super.dispose(); super.dispose();
} }
@ -148,7 +87,6 @@ class _StartPageState extends State<StartPage> with RequestToolMixin {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(statusBarIconBrightness: Brightness.dark));
return WillPopScope( return WillPopScope(
child: Scaffold( child: Scaffold(
body: PageView( body: PageView(
@ -156,11 +94,6 @@ class _StartPageState extends State<StartPage> with RequestToolMixin {
physics: const BouncingScrollPhysics(), physics: const BouncingScrollPhysics(),
onPageChanged: (index) { onPageChanged: (index) {
_pageController._pageIndexState.pageIndex.value = index; _pageController._pageIndexState.pageIndex.value = index;
if (index == 2) {
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(statusBarIconBrightness: Brightness.light));
} else {
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(statusBarIconBrightness: Brightness.dark));
}
}, },
children: _bodyList, children: _bodyList,
), ),
@ -185,14 +118,11 @@ class _StartPageState extends State<StartPage> with RequestToolMixin {
], ],
// //
type: BottomNavigationBarType.fixed, type: BottomNavigationBarType.fixed,
fixedColor: Theme.of(context).primaryColor,
unselectedItemColor: Colors.grey,
// unselectedItemColor: const Color.fromRGBO(80, 87, 103, 1),
// backgroundColor: Colors.white,
// //
currentIndex: _pageController._pageIndexState.pageIndex.value, currentIndex: _pageController._pageIndexState.pageIndex.value,
//tabBottom的点击监听 //tabBottom的点击监听
onTap: (index) { onTap: (index) {
print('appbar下标${index}');
_pageController._pageIndexState.pageController.jumpToPage(index); _pageController._pageIndexState.pageController.jumpToPage(index);
}, },
); );

View File

@ -11,7 +11,7 @@ import 'annotate_class_logic.dart';
import 'widget/completed_annotate_item.dart'; import 'widget/completed_annotate_item.dart';
class AnnotateClassPage extends StatefulWidget { class AnnotateClassPage extends StatefulWidget {
const AnnotateClassPage({super.key}); const AnnotateClassPage({Key? key}) : super(key: key);
@override @override
State<AnnotateClassPage> createState() => _AnnotateClassPageState(); State<AnnotateClassPage> createState() => _AnnotateClassPageState();
@ -25,15 +25,13 @@ class _AnnotateClassPageState extends State<AnnotateClassPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
String homeworkId = state.homeworkId.value; String homeworkId = state.homeworkId.value;
return OrientationBuilder( return OrientationBuilder(
builder: (BuildContext context, Orientation orientation) { builder: (BuildContext context, Orientation orientation){
return Scaffold( return Scaffold(
backgroundColor: const Color.fromRGBO(245, 245, 245, 1), backgroundColor: const Color.fromRGBO(245, 245, 245, 1),
appBar: AppBar( appBar: AppBar(
backgroundColor: Colors.white, backgroundColor: Colors.white,
title: Obx(() { title: Obx(() {
return Text(state.name.value, return Text(state.name.value, style: TextStyle(fontSize: 14.sp, color: const Color(0xFF333333)));
style:
TextStyle(fontSize: 14.sp, color: const Color(0xFF333333)));
}), }),
centerTitle: true, centerTitle: true,
leading: IconButton( leading: IconButton(
@ -55,14 +53,13 @@ class _AnnotateClassPageState extends State<AnnotateClassPage> {
controller: logic.refreshController, controller: logic.refreshController,
header: MaterialHeader(), header: MaterialHeader(),
footer: TaurusFooter(), footer: TaurusFooter(),
onRefresh: () async { onRefresh: () async{
return logic.getList(); return logic.getList();
}, },
child: state.completed.value child: state.completed.value
? Utils.isPad() ? Utils.isPad()
? GridView( ? GridView(
gridDelegate: gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, //widget crossAxisCount: 2, //widget
mainAxisSpacing: 10.h, mainAxisSpacing: 10.h,
crossAxisSpacing: 6.w, crossAxisSpacing: 6.w,
@ -118,17 +115,19 @@ class _AnnotateClassPageState extends State<AnnotateClassPage> {
}), }),
), ),
); );
}); }
);
} }
@override @override
void dispose() { void dispose() {
Get.delete<AnnotateClassLogic>(); Get.delete<AnnotateClassLogic>();
super.dispose(); super.dispose();
if (state.preIndex != 3) { if(state.preIndex != 3){
// logic.readOverController.state.tabIndex.value = state.preIndex; // logic.readOverController.state.tabIndex.value = state.preIndex;
} else { }else{
// logic.homeController.getList(); // logic.homeController.getList();
} }
} }
} }

View File

@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart';
@ -31,21 +32,13 @@ class AnswerHandwriting extends Dialog {
final String? questionNo; final String? questionNo;
final Function closeCall; final Function closeCall;
AnswerHandwriting( AnswerHandwriting(
{super.key, {super.key, required this.homeworkId, required this.studentId, required this.closeCall, this.templateId, this.pageNum, this.questionNo});
required this.homeworkId,
required this.studentId,
required this.closeCall,
this.templateId,
this.pageNum,
this.questionNo});
final _handwritingLogic = Get.find<HandwritingLogic>(); final _handwritingLogic = Get.find<HandwritingLogic>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return OrientationBuilder( return OrientationBuilder(builder: (BuildContext context, Orientation orientation) {
builder: (BuildContext context, Orientation orientation) {
var boxHeight = ScreenUtil().screenHeight / 1.168; // var boxHeight = ScreenUtil().screenHeight / 1.168; //
var boxWidth = ScreenUtil().screenWidth - var boxWidth = ScreenUtil().screenWidth - (ScreenUtil().scaleWidth < 1.5 ? 40.r : 40.r); //
(ScreenUtil().scaleWidth < 1.5 ? 40.r : 40.r); //
return Center( return Center(
child: Container( child: Container(
@ -82,8 +75,7 @@ Future<void> showAnswerHandwriting(
} }
Get.put(HandwritingLogic(backCall)); Get.put(HandwritingLogic(backCall));
Get.find<HandwritingLogic>().params.value = Get.find<HandwritingLogic>().params.value = OriginalManuscriptHandwritingParams(
OriginalManuscriptHandwritingParams(
homeworkId: homeworkId, homeworkId: homeworkId,
studentId: studentId, studentId: studentId,
templateId: templateId, templateId: templateId,
@ -131,12 +123,10 @@ class AnswerHandwritingMainBox extends HookWidget with EventBusMixin {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var _useStateModel = UseMainBoxState.use( var _useStateModel = UseMainBoxState.use(homeworkId, studentId, pageNum, questionNo, templateId);
homeworkId, studentId, pageNum, questionNo, templateId);
double barHeight = 62.h; double barHeight = 62.h;
double imageHeight = boxHeight - barHeight; double imageHeight = boxHeight - barHeight;
useValueChanged<JobHandwriting?, void>(_useStateModel.handwritingData.value, useValueChanged<JobHandwriting?, void>(_useStateModel.handwritingData.value, (_, __) {
(_, __) {
var theData = _useStateModel.handwritingData.value; var theData = _useStateModel.handwritingData.value;
_useStateModel.pageNum.value = theData?.pageNum; _useStateModel.pageNum.value = theData?.pageNum;
_useStateModel.pageCount.value = theData?.pageCount ?? 0; _useStateModel.pageCount.value = theData?.pageCount ?? 0;
@ -220,8 +210,7 @@ class UseMainBoxState with RequestToolMixin {
}); });
// //
factory UseMainBoxState.use(String homeworkId, int studentId, factory UseMainBoxState.use(String homeworkId, int studentId, [int? pageNum, String? questionNo, int? templateId]) {
[int? pageNum, String? questionNo, int? templateId]) {
return UseMainBoxState._( return UseMainBoxState._(
homeworkId: homeworkId, homeworkId: homeworkId,
templateId: templateId, templateId: templateId,
@ -247,8 +236,7 @@ class PreviousNutton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Obx(() { return Obx(() {
if (handwritingLogic.resultData.value?.pageNum != null && if (handwritingLogic.resultData.value?.pageNum != null && handwritingLogic.resultData.value!.pageNum > 1) {
handwritingLogic.resultData.value!.pageNum > 1) {
return Positioned( return Positioned(
left: 3.w, left: 3.w,
child: FloatingActionButton( child: FloatingActionButton(
@ -264,8 +252,7 @@ class PreviousNutton extends StatelessWidget {
params.pageNum = resultData.pageNum - 1; params.pageNum = resultData.pageNum - 1;
params.templateId = null; params.templateId = null;
params.questionNo = null; params.questionNo = null;
handwritingLogic.params.value = handwritingLogic.params.value = OriginalManuscriptHandwritingParams.fromJson(params.toJson());
OriginalManuscriptHandwritingParams.fromJson(params.toJson());
// handwritingLogic.params.value = params; // handwritingLogic.params.value = params;
}), }),
child: Icon(Icons.arrow_back_ios, color: Colors.white, size: 22.sp), child: Icon(Icons.arrow_back_ios, color: Colors.white, size: 22.sp),
@ -288,8 +275,7 @@ class NextPageButton extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Obx(() { return Obx(() {
if (handwritingLogic.resultData.value?.pageNum != null && if (handwritingLogic.resultData.value?.pageNum != null &&
handwritingLogic.resultData.value!.pageNum < handwritingLogic.resultData.value!.pageNum < handwritingLogic.resultData.value!.pageCount) {
handwritingLogic.resultData.value!.pageCount) {
return Positioned( return Positioned(
right: 3.w, right: 3.w,
child: FloatingActionButton( child: FloatingActionButton(
@ -304,11 +290,9 @@ class NextPageButton extends StatelessWidget {
params.pageNum = resultData.pageNum + 1; params.pageNum = resultData.pageNum + 1;
params.templateId = null; params.templateId = null;
params.questionNo = null; params.questionNo = null;
handwritingLogic.params.value = handwritingLogic.params.value = OriginalManuscriptHandwritingParams.fromJson(params.toJson());
OriginalManuscriptHandwritingParams.fromJson(params.toJson());
}), }),
child: child: Icon(Icons.arrow_forward_ios, color: Colors.white, size: 22.sp),
Icon(Icons.arrow_forward_ios, color: Colors.white, size: 22.sp),
), ),
); );
} }
@ -322,15 +306,13 @@ class NextPageButton extends StatelessWidget {
class HandwritingDrawBox extends StatefulWidget { class HandwritingDrawBox extends StatefulWidget {
final double boxWidth; final double boxWidth;
final double boxHeight; final double boxHeight;
const HandwritingDrawBox( const HandwritingDrawBox({required this.boxWidth, required this.boxHeight, super.key});
{required this.boxWidth, required this.boxHeight, super.key});
@override @override
State<HandwritingDrawBox> createState() => _HandwritingDrawBoxState(); State<HandwritingDrawBox> createState() => _HandwritingDrawBoxState();
} }
class _HandwritingDrawBoxState extends State<HandwritingDrawBox> class _HandwritingDrawBoxState extends State<HandwritingDrawBox> with EventBusMixin {
with EventBusMixin {
HandwritingLogic handwritingLogic = Get.find<HandwritingLogic>(); // HandwritingLogic handwritingLogic = Get.find<HandwritingLogic>(); //
ImageStream? imageStream; // ImageStream? imageStream; //
@ -369,16 +351,13 @@ class _HandwritingDrawBoxState extends State<HandwritingDrawBox>
}); });
_vnHandWritings = ValueNotifier<List<GestureHandwritingRecording>>([]); _vnHandWritings = ValueNotifier<List<GestureHandwritingRecording>>([]);
_vnPrimaryHandWritings = ValueNotifier<List<GestureHandwritingRecording>>( _vnPrimaryHandWritings = ValueNotifier<List<GestureHandwritingRecording>>(_packagedHandwritingDataAll);
_packagedHandwritingDataAll);
handwritingLogic.toolbar.initialization.listen((e) { handwritingLogic.toolbar.initialization.listen((e) {
// //
if (e) { if (e) {
_packagedHandwritingDatas = _packagedHandwritingDatas = handwritingLogic.packagedHandwritingDatas.value;
handwritingLogic.packagedHandwritingDatas.value; _packagedHandwritingDataAll = handwritingLogic.packagedHandwritingDataAll.value;
_packagedHandwritingDataAll =
handwritingLogic.packagedHandwritingDataAll.value;
} else { } else {
_packagedHandwritingDatas = []; _packagedHandwritingDatas = [];
_packagedHandwritingDataAll = []; _packagedHandwritingDataAll = [];
@ -388,9 +367,7 @@ class _HandwritingDrawBoxState extends State<HandwritingDrawBox>
try { try {
_vnPrimaryHandWritings.value = [..._packagedHandwritingDataAll]; // _vnPrimaryHandWritings.value = [..._packagedHandwritingDataAll]; //
} catch (e) { } catch (e) {
_vnPrimaryHandWritings = _vnPrimaryHandWritings = ValueNotifier<List<GestureHandwritingRecording>>(_packagedHandwritingDataAll);
ValueNotifier<List<GestureHandwritingRecording>>(
_packagedHandwritingDataAll);
} }
// eventFire(model: JobHandwritingPlaybarBus); // eventFire(model: JobHandwritingPlaybarBus);
}); });
@ -444,8 +421,7 @@ class _HandwritingDrawBoxState extends State<HandwritingDrawBox>
// //
var _model = (e as PlaybackSpeedBus); var _model = (e as PlaybackSpeedBus);
speed = _model.speed; speed = _model.speed;
dragProgressBarInitData( dragProgressBarInitData(handwritingDuration - handwritingTime, handwritingDuration);
handwritingDuration - handwritingTime, handwritingDuration);
break; break;
default: default:
} }
@ -470,18 +446,14 @@ class _HandwritingDrawBoxState extends State<HandwritingDrawBox>
}); });
timers = []; timers = [];
// -= // -=
if (recalculate && if (recalculate && pendingData.isNotEmpty && handwritingTime > 0 && (handwritingDuration - handwritingTime > 0)) {
pendingData.isNotEmpty &&
handwritingTime > 0 &&
(handwritingDuration - handwritingTime > 0)) {
// //
pendingData = pendingData.map((e) { pendingData = pendingData.map((e) {
return GestureHandwritingRecording( return GestureHandwritingRecording(
stroke: e.stroke, stroke: e.stroke,
data: e.data, data: e.data,
usageTime: e.usageTime, usageTime: e.usageTime,
intervalTime: intervalTime: e.intervalTime - (handwritingDuration - handwritingTime) * 1000,
e.intervalTime - (handwritingDuration - handwritingTime) * 1000,
); );
}).toList(); }).toList();
} }
@ -501,8 +473,7 @@ class _HandwritingDrawBoxState extends State<HandwritingDrawBox>
} }
handwritingLogic.toolbar.showManuscript.value = false; handwritingLogic.toolbar.showManuscript.value = false;
executableData.forEach((e) { executableData.forEach((e) {
var ter = Timer(Duration(milliseconds: e.intervalTime ~/ speed), var ter = Timer(Duration(milliseconds: e.intervalTime ~/ speed), () => zhixinCall(e));
() => zhixinCall(e));
timers.add(ter); timers.add(ter);
}); });
} catch (e) { } catch (e) {
@ -512,8 +483,7 @@ class _HandwritingDrawBoxState extends State<HandwritingDrawBox>
Future<void> zhixinCall(GestureHandwritingRecording e) async { Future<void> zhixinCall(GestureHandwritingRecording e) async {
if (mounted) { if (mounted) {
List<GestureHandwritingRecording> trajectorys = List<GestureHandwritingRecording> trajectorys = handwritingLogic.toolbar.executionData.value..add(e);
handwritingLogic.toolbar.executionData.value..add(e);
handwritingLogic.toolbar.executionData.value = List.from(trajectorys); handwritingLogic.toolbar.executionData.value = List.from(trajectorys);
pendingData.remove(e); // pendingData.remove(e); //
} }
@ -569,26 +539,20 @@ class _HandwritingDrawBoxState extends State<HandwritingDrawBox>
var paperPicture = handwritingLogic.resultData.value?.paperPicture; var paperPicture = handwritingLogic.resultData.value?.paperPicture;
if (paperPicture == null) return const SizedBox(); if (paperPicture == null) return const SizedBox();
print( print('显示原稿:${handwritingLogic.toolbar.showManuscript.value} 数据:${_vnPrimaryHandWritings.value.length}');
'显示原稿:${handwritingLogic.toolbar.showManuscript.value} 数据:${_vnPrimaryHandWritings.value.length}');
return RepaintBoundary( return RepaintBoundary(
child: CustomPaint( child: CustomPaint(
foregroundPainter: HandWritingDrawingPainter( foregroundPainter: HandWritingDrawingPainter(
ctrl: handwritingLogic.toolbar.showManuscript.value ctrl: handwritingLogic.toolbar.showManuscript.value ? _vnPrimaryHandWritings : _vnHandWritings,
? _vnPrimaryHandWritings
: _vnHandWritings,
), ),
child: $TheCachedNetworkImage( child: $TheCachedNetworkImage(
imageUrl: paperPicture, imageUrl: paperPicture,
(context, imageProvider) { (context, imageProvider) {
Image imageWidget = Image imageWidget = Image(image: imageProvider, fit: BoxFit.contain);
Image(image: imageProvider, fit: BoxFit.contain);
var imagInfoModel = handwritingLogic.imagInfoModel.value; var imagInfoModel = handwritingLogic.imagInfoModel.value;
if (imagInfoModel == null || if (imagInfoModel == null || imagInfoModel.boxWidth != widget.boxWidth) {
imagInfoModel.boxWidth != widget.boxWidth) {
imageStream?.removeListener(theImageStreamListener); imageStream?.removeListener(theImageStreamListener);
imageStream = imageStream = imageWidget.image.resolve(const ImageConfiguration());
imageWidget.image.resolve(const ImageConfiguration());
imageStream?.addListener(theImageStreamListener); imageStream?.addListener(theImageStreamListener);
} }
return imageWidget; return imageWidget;
@ -626,8 +590,7 @@ class HandWritingDrawingPainter extends CustomPainter {
var _length = points.length; var _length = points.length;
for (int i = 0; i < _length; i++) { for (int i = 0; i < _length; i++) {
GestureHandwritingRecording item = points[i]; GestureHandwritingRecording item = points[i];
GestureHandwritingRecording? nextItem = GestureHandwritingRecording? nextItem = i + 1 < _length ? points[i + 1] : null;
i + 1 < _length ? points[i + 1] : null;
Offset offsetData = item.data; Offset offsetData = item.data;
Offset? nextOffsetData = nextItem?.data; Offset? nextOffsetData = nextItem?.data;
@ -641,8 +604,7 @@ class HandWritingDrawingPainter extends CustomPainter {
@override @override
bool shouldRepaint(covariant CustomPainter oldDelegate) { bool shouldRepaint(covariant CustomPainter oldDelegate) {
if (oldDelegate is HandWritingDrawingPainter) { if (oldDelegate is HandWritingDrawingPainter) {
var repaint = ctrl.value.length != oldDelegate.ctrl.value.length || var repaint = ctrl.value.length != oldDelegate.ctrl.value.length || oldDelegate.ctrl.value != ctrl.value;
oldDelegate.ctrl.value != ctrl.value;
print('调用是否绘制:$repaint'); print('调用是否绘制:$repaint');
return repaint; return repaint;
} }
@ -654,8 +616,7 @@ class HandWritingDrawingPainter extends CustomPainter {
class PageNumberBox extends StatelessWidget { class PageNumberBox extends StatelessWidget {
PageNumberBox({super.key}); PageNumberBox({super.key});
final HandwritingLogic handwritingLogic = final HandwritingLogic handwritingLogic = Get.find<HandwritingLogic>(); //
Get.find<HandwritingLogic>(); //
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -673,20 +634,11 @@ class PageNumberBox extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Obx(() { Obx(() {
return quickText( return quickText('${handwritingLogic.resultData.value?.pageNum ?? 0}', color: Colors.white, size: 11.sp, align: TextAlign.end);
'${handwritingLogic.resultData.value?.pageNum ?? 0}',
color: Colors.white,
size: 11.sp,
align: TextAlign.end);
}), }),
quickText('/', quickText('/', color: Colors.white, size: 10.sp, align: TextAlign.end),
color: Colors.white, size: 10.sp, align: TextAlign.end),
Obx(() { Obx(() {
return quickText( return quickText('${handwritingLogic.resultData.value?.pageCount ?? 0}', color: Colors.white, size: 8.sp, align: TextAlign.end);
'${handwritingLogic.resultData.value?.pageCount ?? 0}',
color: Colors.white,
size: 8.sp,
align: TextAlign.end);
}), }),
], ],
)), )),
@ -695,8 +647,7 @@ class PageNumberBox extends StatelessWidget {
} }
@hwidget @hwidget
Widget $bottomPlaybar( Widget $bottomPlaybar(BuildContext context, double barHeight, HandwritingLogic handwritingLogic) {
BuildContext context, double barHeight, HandwritingLogic handwritingLogic) {
var timeConsuming = useState(0); var timeConsuming = useState(0);
var handwritingInfo = useState<HandwritingInfo?>(null); var handwritingInfo = useState<HandwritingInfo?>(null);
@ -714,10 +665,8 @@ Widget $bottomPlaybar(
usePlaybar.useTime.value = usePlaybar.handwritingDuration.value; usePlaybar.useTime.value = usePlaybar.handwritingDuration.value;
}); });
// //
useValueChanged<PlaybackSpeed, void>(usePlaybar.constantFastSpeed.value, useValueChanged<PlaybackSpeed, void>(usePlaybar.constantFastSpeed.value, (_, __) {
(_, __) { usePlaybar.eventFire(model: PlaybackSpeedBus(usePlaybar.constantFastSpeed.value.speed));
usePlaybar.eventFire(
model: PlaybackSpeedBus(usePlaybar.constantFastSpeed.value.speed));
// //
usePlaybar.playTimingSuspend(); usePlaybar.playTimingSuspend();
usePlaybar.playTimingStarts(); usePlaybar.playTimingStarts();
@ -726,12 +675,9 @@ Widget $bottomPlaybar(
useValueChanged<int, void>(usePlaybar.useTime.value, (_, __) { useValueChanged<int, void>(usePlaybar.useTime.value, (_, __) {
var _runtime = usePlaybar.useTime.value; var _runtime = usePlaybar.useTime.value;
if (_runtime <= 0 || usePlaybar.handwritingDuration.value == _runtime) { if (_runtime <= 0 || usePlaybar.handwritingDuration.value == _runtime) {
Future.delayed( Future.delayed(Duration.zero, () => (usePlaybar.playPause.value = false)); //
Duration.zero, () => (usePlaybar.playPause.value = false)); //
} }
usePlaybar.eventFire( usePlaybar.eventFire(model: JobHandwritingRunTimeBus(_runtime, usePlaybar.handwritingDuration.value));
model: JobHandwritingRunTimeBus(
_runtime, usePlaybar.handwritingDuration.value));
}); });
useEffect(() { useEffect(() {
@ -762,8 +708,7 @@ Widget $bottomPlaybar(
break; break;
case JobHandwritingGetReadyBus: case JobHandwritingGetReadyBus:
// //
Future.delayed( Future.delayed(Duration.zero, () => (usePlaybar.handWritingReady.value = true));
Duration.zero, () => (usePlaybar.handWritingReady.value = true));
break; break;
default: default:
} }
@ -792,17 +737,13 @@ Widget $bottomPlaybar(
if (usePlaybar.handWritingReady.value) if (usePlaybar.handWritingReady.value)
InkWell( InkWell(
onTap: () => easyThrottle('job_handwriting_play_pause', () { onTap: () => easyThrottle('job_handwriting_play_pause', () {
if (usePlaybar.handwritingDuration.value == 0) if (usePlaybar.handwritingDuration.value == 0) return ToastUtils.showInfo('没有笔迹');
return ToastUtils.showInfo('没有笔迹');
usePlaybar.playPause.value = !usePlaybar.playPause.value; usePlaybar.playPause.value = !usePlaybar.playPause.value;
usePlaybar.eventFire( usePlaybar.eventFire(model: JobHandwritingPlaybarBus(usePlaybar.playPause.value));
model: JobHandwritingPlaybarBus(usePlaybar.playPause.value));
}), }),
child: Icon( child: Icon(
!usePlaybar.playPause.value !usePlaybar.playPause.value ? Icons.play_circle_outline : Icons.pause_circle_outline,
? Icons.play_circle_outline
: Icons.pause_circle_outline,
color: Colors.white, color: Colors.white,
size: 28.r, size: 28.r,
), ),
@ -814,11 +755,9 @@ Widget $bottomPlaybar(
child: LayoutBuilder(builder: (context, constraints) { child: LayoutBuilder(builder: (context, constraints) {
final double containerWidth = constraints.maxWidth; // final double containerWidth = constraints.maxWidth; //
var unitScale = containerWidth / timeConsuming.value; // var unitScale = containerWidth / timeConsuming.value; //
var pauseIntervalsLength = var pauseIntervalsLength = handwritingInfo.value?.pauseInterval.length ?? 0;
handwritingInfo.value?.pauseInterval.length ?? 0;
List<Widget> pauseTickMarks = List<Widget> pauseTickMarks = handwritingInfo.value?.pauseInterval.asMap().keys.map((e) {
handwritingInfo.value?.pauseInterval.asMap().keys.map((e) {
bool isLast = e == pauseIntervalsLength - 1; bool isLast = e == pauseIntervalsLength - 1;
bool isFirst = e == 0; bool isFirst = e == 0;
var item = handwritingInfo.value!.pauseInterval[e]; var item = handwritingInfo.value!.pauseInterval[e];
@ -831,14 +770,8 @@ Widget $bottomPlaybar(
decoration: BoxDecoration( decoration: BoxDecoration(
color: Color.fromRGBO(202, 201, 201, 1), color: Color.fromRGBO(202, 201, 201, 1),
borderRadius: isFirst borderRadius: isFirst
? BorderRadius.only( ? BorderRadius.only(topLeft: Radius.circular(8.r), bottomLeft: Radius.circular(10.r))
topLeft: Radius.circular(8.r), : (isLast ? BorderRadius.only(topRight: Radius.circular(8.r), bottomRight: Radius.circular(10.r)) : null),
bottomLeft: Radius.circular(10.r))
: (isLast
? BorderRadius.only(
topRight: Radius.circular(8.r),
bottomRight: Radius.circular(10.r))
: null),
), ),
), ),
); );
@ -867,42 +800,29 @@ Widget $bottomPlaybar(
child: SliderTheme( child: SliderTheme(
data: SliderTheme.of(context).copyWith( data: SliderTheme.of(context).copyWith(
trackHeight: 10.h, // trackHeight: 10.h, //
trackShape: trackShape: RoundedRectSliderTrackShape(), //
RoundedRectSliderTrackShape(), // activeTrackColor: Theme.of(context).primaryColor, //
activeTrackColor:
Theme.of(context).primaryColor, //
inactiveTrackColor: Colors.transparent, // inactiveTrackColor: Colors.transparent, //
thumbShape: RoundSliderThumbShape( thumbShape: RoundSliderThumbShape(enabledThumbRadius: 0, disabledThumbRadius: 0),
enabledThumbRadius: 0, disabledThumbRadius: 0),
thumbColor: Colors.white, // thumbColor: Colors.white, //
overlayShape: overlayShape: RoundSliderOverlayShape(overlayRadius: 0),
RoundSliderOverlayShape(overlayRadius: 0),
overlayColor: Colors.black54, // overlayColor: Colors.black54, //
// valueIndicatorShape: PaddleSliderValueIndicatorShape(), // // valueIndicatorShape: PaddleSliderValueIndicatorShape(), //
), ),
child: Slider( child: Slider(
value: (usePlaybar.handwritingDuration.value - value: (usePlaybar.handwritingDuration.value - usePlaybar.useTime.value).toDouble(),
usePlaybar.useTime.value)
.toDouble(),
min: 0.0, min: 0.0,
max: usePlaybar.handwritingDuration.value.toDouble(), max: usePlaybar.handwritingDuration.value.toDouble(),
inactiveColor: Colors.transparent, inactiveColor: Colors.transparent,
onChangeEnd: (value) { onChangeEnd: (value) {
if (!usePlaybar.handWritingReady.value) return; if (!usePlaybar.handWritingReady.value) return;
usePlaybar.playTimingSuspend(); // usePlaybar.playTimingSuspend(); //
usePlaybar.eventFire( usePlaybar.eventFire(model: JobHandwritingDragProgressBarBus(value.toInt(), usePlaybar.handwritingDuration.value));
model: JobHandwritingDragProgressBarBus( usePlaybar.useTime.value = usePlaybar.handwritingDuration.value - value.toInt();
value.toInt(),
usePlaybar.handwritingDuration.value));
usePlaybar.useTime.value =
usePlaybar.handwritingDuration.value -
value.toInt();
}, },
onChanged: (double value) { onChanged: (double value) {
if (!usePlaybar.handWritingReady.value) return; if (!usePlaybar.handWritingReady.value) return;
usePlaybar.useTime.value = usePlaybar.useTime.value = usePlaybar.handwritingDuration.value - value.toInt();
usePlaybar.handwritingDuration.value -
value.toInt();
}, },
), ),
), ),
@ -915,16 +835,8 @@ Widget $bottomPlaybar(
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
quickText( quickText('累计停顿:${handwritingInfo.value?.pauseCount ?? 0}', color: Colors.white, size: 7.sp),
'累计停顿:${handwritingInfo.value?.pauseCount ?? 0}', quickText(convertSeconds(usePlaybar.useTime.value)?.toString() ?? '', color: Colors.white, size: 7.sp),
color: Colors.white,
size: 7.sp),
quickText(
convertSeconds(usePlaybar.useTime.value)
?.toString() ??
'',
color: Colors.white,
size: 7.sp),
], ],
), ),
) )
@ -939,20 +851,16 @@ Widget $bottomPlaybar(
children: [ children: [
InkWell( InkWell(
onTap: () => easyThrottle('job_handwriting_speed', () { onTap: () => easyThrottle('job_handwriting_speed', () {
var theIndex = PlaybackSpeed.values var theIndex = PlaybackSpeed.values.indexOf(usePlaybar.constantFastSpeed.value);
.indexOf(usePlaybar.constantFastSpeed.value);
if (theIndex == PlaybackSpeed.values.length - 1) { if (theIndex == PlaybackSpeed.values.length - 1) {
theIndex = -1; theIndex = -1;
} }
usePlaybar.constantFastSpeed.value = usePlaybar.constantFastSpeed.value = PlaybackSpeed.values[theIndex + 1];
PlaybackSpeed.values[theIndex + 1];
}, duration: Duration(milliseconds: 500)), }, duration: Duration(milliseconds: 500)),
child: Container( child: Container(
// alignment: Alignment., // alignment: Alignment.,
padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 1.5.h), padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 1.5.h),
decoration: BoxDecoration( decoration: BoxDecoration(color: Color.fromRGBO(182, 197, 250, 1), borderRadius: BorderRadius.circular(4.r)),
color: Color.fromRGBO(182, 197, 250, 1),
borderRadius: BorderRadius.circular(4.r)),
child: quickText( child: quickText(
'${usePlaybar.constantFastSpeed.value.name}', '${usePlaybar.constantFastSpeed.value.name}',
color: Color.fromRGBO(79, 114, 244, 1), color: Color.fromRGBO(79, 114, 244, 1),
@ -987,12 +895,9 @@ class StudentManuscriptBtn extends StatelessWidget {
padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 1.5.h), padding: EdgeInsets.symmetric(horizontal: 3.w, vertical: 1.5.h),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r), borderRadius: BorderRadius.circular(4.r),
color: handwritingLogic.toolbar.showManuscript.value color: handwritingLogic.toolbar.showManuscript.value ? Theme.of(context).primaryColor : Colors.grey,
? Theme.of(context).primaryColor
: Colors.grey,
), ),
child: quickText('学生原稿', child: quickText('学生原稿', color: Colors.white, size: 8.sp, align: TextAlign.center),
color: Colors.white, size: 8.sp, align: TextAlign.center),
), ),
); );
}); });
@ -1006,8 +911,7 @@ class SysjTime extends StatefulWidget {
State<SysjTime> createState() => _SysjTimeState(); State<SysjTime> createState() => _SysjTimeState();
} }
class _SysjTimeState extends State<SysjTime> class _SysjTimeState extends State<SysjTime> with EventBusMixin<JobHandwritingRunTimeBus> {
with EventBusMixin<JobHandwritingRunTimeBus> {
int useTime = 0; int useTime = 0;
@override @override
void initState() { void initState() {
@ -1026,8 +930,7 @@ class _SysjTimeState extends State<SysjTime>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return quickText(convertSeconds(useTime)?.toString() ?? '', return quickText(convertSeconds(useTime)?.toString() ?? '', color: Colors.white, size: 7.sp);
color: Colors.white, size: 7.sp);
} }
} }
@ -1068,9 +971,7 @@ class UseBottomPlaybar with EventBusMixin {
if (useTime.value > 0) { if (useTime.value > 0) {
timer.value?.cancel(); timer.value?.cancel();
timer.value = Timer.periodic( timer.value = Timer.periodic(Duration(milliseconds: 1000 ~/ constantFastSpeed.value.speed), (theTime) {
Duration(milliseconds: 1000 ~/ constantFastSpeed.value.speed),
(theTime) {
useTime.value -= 1; useTime.value -= 1;
if (useTime.value < 0) { if (useTime.value < 0) {
theTime.cancel(); theTime.cancel();

View File

@ -41,15 +41,13 @@ class _QuestionPaperViewState extends State<QuestionPaperView> {
// //
Expanded( Expanded(
flex: 7, flex: 7,
child: LayoutBuilder( child: LayoutBuilder(builder: (BuildContext context, BoxConstraints constraints) {
builder: (BuildContext context, BoxConstraints constraints) {
var maxWidth = constraints.maxWidth; var maxWidth = constraints.maxWidth;
var maxHeight = constraints.maxHeight; var maxHeight = constraints.maxHeight;
return Stack( return Stack(
children: [ children: [
// //
QuestionImageView( QuestionImageView(maxWidth, maxHeight, sateData, annotationState, logic),
maxWidth, maxHeight, sateData, annotationState, logic),
// //
// Positioned(right: 3.w, bottom: 4.h, child: const $ContinueToReview(isFloatingAction: true)), // Positioned(right: 3.w, bottom: 4.h, child: const $ContinueToReview(isFloatingAction: true)),
// //
@ -63,19 +61,15 @@ class _QuestionPaperViewState extends State<QuestionPaperView> {
heroTag: '点击前往上一题', heroTag: '点击前往上一题',
tooltip: '点击前往上一题', tooltip: '点击前往上一题',
focusColor: Theme.of(context).primaryColor, focusColor: Theme.of(context).primaryColor,
backgroundColor: backgroundColor: const Color.fromRGBO(24, 32, 32, 0.05),
const Color.fromRGBO(24, 32, 32, 0.05),
elevation: 10.r, elevation: 10.r,
onPressed: () => onPressed: () => easyThrottle('TestQuestionSwitch', () {
easyThrottle('TestQuestionSwitch', () {
var param = sateData.param.value; var param = sateData.param.value;
param.studentId = lastPageVal.studentId; param.studentId = lastPageVal.studentId;
param.templateId = lastPageVal.templateId; param.templateId = lastPageVal.templateId;
sateData.param.value = sateData.param.value = DoPaperDetailsParam.fromJson(param.toJson());
DoPaperDetailsParam.fromJson(param.toJson());
}), }),
child: Icon(Icons.arrow_back_ios, child: Icon(Icons.arrow_back_ios, color: Colors.white, size: 22.sp),
color: Colors.white, size: 22.sp),
); );
}), }),
), ),
@ -90,18 +84,14 @@ class _QuestionPaperViewState extends State<QuestionPaperView> {
heroTag: '点击前往下一题', heroTag: '点击前往下一题',
tooltip: '点击前往下一题', tooltip: '点击前往下一题',
elevation: 10.r, elevation: 10.r,
backgroundColor: backgroundColor: const Color.fromRGBO(24, 32, 32, 0.05),
const Color.fromRGBO(24, 32, 32, 0.05), onPressed: () => easyThrottle('TestQuestionSwitch', () {
onPressed: () =>
easyThrottle('TestQuestionSwitch', () {
var param = sateData.param.value; var param = sateData.param.value;
param.studentId = nextPageVal.studentId; param.studentId = nextPageVal.studentId;
param.templateId = nextPageVal.templateId; param.templateId = nextPageVal.templateId;
sateData.param.value = sateData.param.value = DoPaperDetailsParam.fromJson(param.toJson());
DoPaperDetailsParam.fromJson(param.toJson());
}), }),
child: Icon(Icons.arrow_forward_ios, child: Icon(Icons.arrow_forward_ios, color: Colors.white, size: 22.sp),
color: Colors.white, size: 22.sp),
); );
}), }),
), ),
@ -122,8 +112,7 @@ class _QuestionPaperViewState extends State<QuestionPaperView> {
child: CupertinoButton( child: CupertinoButton(
color: Colors.grey[300], color: Colors.grey[300],
onPressed: () => easyThrottle('home_work_reload_data', () { onPressed: () => easyThrottle('home_work_reload_data', () {
sateData.param.value = sateData.param.value = DoPaperDetailsParam.fromJson(sateData.param.value.toJson());
DoPaperDetailsParam.fromJson(sateData.param.value.toJson());
}), }),
child: quickText('重新请求', color: Colors.black38), child: quickText('重新请求', color: Colors.black38),
), ),
@ -136,8 +125,7 @@ class _QuestionPaperViewState extends State<QuestionPaperView> {
// //
@swidget @swidget
Widget $totalSubmitCountView( Widget $totalSubmitCountView(BuildContext context, HomeworkReviewState sateData) {
BuildContext context, HomeworkReviewState sateData) {
return Obx(() { return Obx(() {
var data = sateData.data.value; var data = sateData.data.value;
if (data == null) return Container(); if (data == null) return Container();
@ -152,10 +140,7 @@ Widget $totalSubmitCountView(
context: context, context: context,
elevation: 10, elevation: 10,
backgroundColor: Colors.white, backgroundColor: Colors.white,
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(borderRadius: BorderRadius.only(topLeft: Radius.circular(10.r), topRight: Radius.circular(10.r))),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10.r),
topRight: Radius.circular(10.r))),
builder: (BuildContext context) { builder: (BuildContext context) {
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: 2.w), padding: EdgeInsets.symmetric(horizontal: 2.w),
@ -173,8 +158,7 @@ Widget $totalSubmitCountView(
SizedBox(height: 10.h), SizedBox(height: 10.h),
Expanded( Expanded(
child: ListView( child: ListView(
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 4.w),
vertical: 8.h, horizontal: 4.w),
children: [ children: [
Wrap( Wrap(
spacing: 7.2.w, // () spacing: 7.2.w, // ()
@ -185,40 +169,27 @@ Widget $totalSubmitCountView(
alignment: const FractionalOffset(0.05, 0.09), alignment: const FractionalOffset(0.05, 0.09),
children: [ children: [
Container( Container(
padding: EdgeInsets.only( padding: EdgeInsets.only(top: 1.2.h, bottom: 1.5.h, left: 13.w, right: 5.w),
top: 1.2.h,
bottom: 1.5.h,
left: 13.w,
right: 5.w),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4.r), borderRadius: BorderRadius.circular(4.r),
color: const Color.fromRGBO( color: const Color.fromRGBO(239, 242, 255, 1),
239, 242, 255, 1),
), ),
child: quickText( child: quickText(
e.name, e.name,
size: 12.sp, size: 12.sp,
wordSpacing: 2, wordSpacing: 2,
color: color: const Color.fromRGBO(80, 94, 110, 1),
const Color.fromRGBO(80, 94, 110, 1),
), ),
), ),
Stack( Stack(
alignment: alignment: const FractionalOffset(0.52, 0.24),
const FractionalOffset(0.52, 0.24),
children: [ children: [
Icon( Icon(
const IconData(0xe63d, const IconData(0xe63d, fontFamily: "AlibabaIcon"),
fontFamily: "AlibabaIcon"),
size: 12.sp, size: 12.sp,
color: e.isPriority color: e.isPriority ? const Color.fromRGBO(76, 199, 147, 1) : const Color.fromRGBO(164, 164, 164, 1),
? const Color.fromRGBO(
76, 199, 147, 1)
: const Color.fromRGBO(
164, 164, 164, 1),
), ),
quickText('优先', quickText('优先', size: 4.sp, color: Colors.white),
size: 4.sp, color: Colors.white),
], ],
), ),
], ],
@ -240,17 +211,11 @@ Widget $totalSubmitCountView(
children: [ children: [
Padding( Padding(
padding: EdgeInsets.only(bottom: 1.h), padding: EdgeInsets.only(bottom: 1.h),
child: quickText('已阅', child: quickText('已阅', color: const Color.fromRGBO(117, 117, 117, 1), size: 10.sp),
color: const Color.fromRGBO(117, 117, 117, 1), size: 10.sp),
), ),
quickText(data.annotatedCount, quickText(data.annotatedCount, color: const Color.fromRGBO(76, 199, 147, 1), size: 12.sp, fontWeight: FontWeight.bold),
color: const Color.fromRGBO(76, 199, 147, 1), quickText('/', color: const Color.fromRGBO(117, 117, 117, 1), size: 12.sp),
size: 12.sp, quickText(data.submitCount - data.annotatedCount, color: const Color.fromRGBO(117, 117, 117, 1), size: 10.sp),
fontWeight: FontWeight.bold),
quickText('/',
color: const Color.fromRGBO(117, 117, 117, 1), size: 12.sp),
quickText(data.submitCount - data.annotatedCount,
color: const Color.fromRGBO(117, 117, 117, 1), size: 10.sp),
], ],
), ),
), ),
@ -260,18 +225,15 @@ Widget $totalSubmitCountView(
// //
@hwidget @hwidget
Widget $questionNumberView(BuildContext context, HomeworkReviewLogic logic, Widget $questionNumberView(BuildContext context, HomeworkReviewLogic logic, HomeworkReviewState sateData) {
HomeworkReviewState sateData) {
final scrollControllerNum = useScrollController(); // final scrollControllerNum = useScrollController(); //
useEffect(() { useEffect(() {
scrollControllerNum.addListener(() { scrollControllerNum.addListener(() {
if (sateData.panQuestView == false) if (sateData.panQuestView == false) sateData.slide.value = scrollControllerNum.offset;
sateData.slide.value = scrollControllerNum.offset;
}); });
var listenVal = sateData.slide.listen((e) { var listenVal = sateData.slide.listen((e) {
if (e != scrollControllerNum.offset && sateData.panQuestView == true) if (e != scrollControllerNum.offset && sateData.panQuestView == true) scrollControllerNum.jumpTo(e);
scrollControllerNum.jumpTo(e);
}); });
return () { return () {
@ -309,20 +271,13 @@ Widget $questionNumberView(BuildContext context, HomeworkReviewLogic logic,
return Container( return Container(
height: boxHeight > actualImgHeight ? boxHeight : actualImgHeight, height: boxHeight > actualImgHeight ? boxHeight : actualImgHeight,
padding: EdgeInsets.only( padding: EdgeInsets.only(top: imageVal.remainingHeight > 0 ? imageVal.remainingHeight / 2 : 0),
top: imageVal.remainingHeight > 0
? imageVal.remainingHeight / 2
: 0),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: studentQuestions children: studentQuestions
?.asMap() ?.asMap()
.keys .keys
.map((e) => $ScoringQuestionsView( .map((e) => $ScoringQuestionsView(logic, studentQuestions[e], imageVal.scaleRatio, studentQuestions))
logic,
studentQuestions[e],
imageVal.scaleRatio,
studentQuestions))
.toList() ?? .toList() ??
[], [],
), ),
@ -335,11 +290,7 @@ Widget $questionNumberView(BuildContext context, HomeworkReviewLogic logic,
// //
@hwidget @hwidget
Widget $scoringQuestionsView( Widget $scoringQuestionsView(
BuildContext context, BuildContext context, HomeworkReviewLogic logic, StudentQuestions item, double scaleRatio, List<StudentQuestions>? studentQuestions) {
HomeworkReviewLogic logic,
StudentQuestions item,
double scaleRatio,
List<StudentQuestions>? studentQuestions) {
var studentScore = useState<int?>(item.studentScore); var studentScore = useState<int?>(item.studentScore);
useValueChanged<int?, void>(studentScore.value, (_, __) { useValueChanged<int?, void>(studentScore.value, (_, __) {
@ -348,8 +299,7 @@ Widget $scoringQuestionsView(
// //
var annotateTime = logic.state.data.value?.annotateTime; var annotateTime = logic.state.data.value?.annotateTime;
if (annotateTime == null) { if (annotateTime == null) {
var noRatingGiven = var noRatingGiven = studentQuestions!.firstWhereOrNull((e) => e.studentScore == null);
studentQuestions!.firstWhereOrNull((e) => e.studentScore == null);
if (noRatingGiven == null) logic.submit(context); if (noRatingGiven == null) logic.submit(context);
} }
}); });
@ -362,9 +312,7 @@ Widget $scoringQuestionsView(
return () {}; return () {};
}, []); }, []);
var padinVal = item.correctRate > 0 var padinVal = item.correctRate > 0 ? EdgeInsets.only(top: 6.4.h) : EdgeInsets.symmetric(vertical: 2.h);
? EdgeInsets.only(top: 6.4.h)
: EdgeInsets.symmetric(vertical: 2.h);
return Container( return Container(
height: item.height * scaleRatio, height: item.height * scaleRatio,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
@ -380,24 +328,20 @@ Widget $scoringQuestionsView(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap, tapTargetSize: MaterialTapTargetSize.shrinkWrap,
backgroundColor: backgroundColor: const Color.fromRGBO(237, 237, 237, 1), //
const Color.fromRGBO(237, 237, 237, 1), // shape: const RoundedRectangleBorder(borderRadius: BorderRadius.zero), //
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.zero), //
), ),
child: Padding( child: Padding(
padding: padinVal, padding: padinVal,
child: Icon( child: Icon(
size: 22.sp, size: 22.sp,
color: studentScore.value == 2 color: studentScore.value == 2 ? const Color.fromRGBO(255, 152, 0, 1) : const Color.fromRGBO(114, 114, 114, 1),
? const Color.fromRGBO(255, 152, 0, 1)
: const Color.fromRGBO(114, 114, 114, 1),
const IconData(0xe62b, fontFamily: "AlibabaIcon"), const IconData(0xe62b, fontFamily: "AlibabaIcon"),
), ),
), ),
onPressed: () => easyThrottle('scoring_homework_questions', () { onPressed: () => easyThrottle('scoring_homework_questions', () {
studentScore.value = studentScore.value == 2 ? null : 2; studentScore.value = studentScore.value == 2 ? null : 2;
}, duration: const Duration(milliseconds: 222)), }),
), ),
), ),
// //
@ -406,24 +350,20 @@ Widget $scoringQuestionsView(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap, tapTargetSize: MaterialTapTargetSize.shrinkWrap,
backgroundColor: backgroundColor: const Color.fromRGBO(237, 237, 237, 1), //
const Color.fromRGBO(237, 237, 237, 1), // shape: const RoundedRectangleBorder(borderRadius: BorderRadius.zero), //
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.zero), //
), ),
child: Padding( child: Padding(
padding: padinVal, padding: padinVal,
child: Icon( child: Icon(
size: 22.sp, size: 22.sp,
color: studentScore.value == 1 color: studentScore.value == 1 ? const Color.fromRGBO(255, 152, 0, 1) : const Color.fromRGBO(114, 114, 114, 1),
? const Color.fromRGBO(255, 152, 0, 1)
: const Color.fromRGBO(114, 114, 114, 1),
const IconData(0xe62c, fontFamily: "AlibabaIcon"), const IconData(0xe62c, fontFamily: "AlibabaIcon"),
), ),
), ),
onPressed: () => easyThrottle('scoring_homework_questions', () { onPressed: () => easyThrottle('scoring_homework_questions', () {
studentScore.value = studentScore.value == 1 ? null : 1; studentScore.value = studentScore.value == 1 ? null : 1;
}, duration: const Duration(milliseconds: 222)), }),
), ),
), ),
// //
@ -432,24 +372,20 @@ Widget $scoringQuestionsView(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
tapTargetSize: MaterialTapTargetSize.shrinkWrap, tapTargetSize: MaterialTapTargetSize.shrinkWrap,
backgroundColor: backgroundColor: const Color.fromRGBO(237, 237, 237, 1), //
const Color.fromRGBO(237, 237, 237, 1), // shape: const RoundedRectangleBorder(borderRadius: BorderRadius.zero), //
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.zero), //
), ),
child: Padding( child: Padding(
padding: padinVal, padding: padinVal,
child: Icon( child: Icon(
size: 22.sp, size: 22.sp,
color: studentScore.value == 0 color: studentScore.value == 0 ? const Color.fromRGBO(255, 152, 0, 1) : const Color.fromRGBO(114, 114, 114, 1),
? const Color.fromRGBO(255, 152, 0, 1)
: const Color.fromRGBO(114, 114, 114, 1),
const IconData(0xe62a, fontFamily: "AlibabaIcon"), const IconData(0xe62a, fontFamily: "AlibabaIcon"),
), ),
), ),
onPressed: () => easyThrottle('scoring_homework_questions', () { onPressed: () => easyThrottle('scoring_homework_questions', () {
studentScore.value = studentScore.value == 0 ? null : 0; studentScore.value = studentScore.value == 0 ? null : 0;
}, duration: const Duration(milliseconds: 222)), }),
), ),
), ),
], ],
@ -460,11 +396,8 @@ Widget $scoringQuestionsView(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
SizedBox(width: 1.1.w), SizedBox(width: 1.1.w),
quickText('${item.questionNo}', quickText('${item.questionNo}', color: Theme.of(context).primaryColor.withOpacity(0.7), size: 8.sp),
color: Theme.of(context).primaryColor.withOpacity(0.7), if (item.correctRate > 0) quickText(' 正确率', color: Colors.grey, size: 5.sp),
size: 8.sp),
if (item.correctRate > 0)
quickText(' 正确率', color: Colors.grey, size: 5.sp),
if (item.correctRate > 0) if (item.correctRate > 0)
Expanded( Expanded(
child: LinearPercentIndicator( child: LinearPercentIndicator(
@ -474,10 +407,7 @@ Widget $scoringQuestionsView(
alignment: MainAxisAlignment.center, alignment: MainAxisAlignment.center,
progressColor: const Color.fromRGBO(76, 199, 147, 0.6), progressColor: const Color.fromRGBO(76, 199, 147, 0.6),
backgroundColor: const Color(0xFFB8C7CB).withOpacity(0.35), backgroundColor: const Color(0xFFB8C7CB).withOpacity(0.35),
center: quickText("${item.correctRate}%", center: quickText("${item.correctRate}%", size: 5.sp, align: TextAlign.center, color: Colors.white),
size: 5.sp,
align: TextAlign.center,
color: Colors.white),
), ),
) )
], ],
@ -489,16 +419,13 @@ Widget $scoringQuestionsView(
} }
// //
class QuestionImageView extends HookWidget class QuestionImageView extends HookWidget with EventBusMixin<BottomOperationBar> {
with EventBusMixin<BottomOperationBar> {
final double maxWidth; final double maxWidth;
final double maxHeight; final double maxHeight;
final HomeworkReviewLogic logic; final HomeworkReviewLogic logic;
final HomeworkReviewState sateData; final HomeworkReviewState sateData;
final HomeworkReviewAnnotationsControlState annotationState; final HomeworkReviewAnnotationsControlState annotationState;
QuestionImageView(this.maxWidth, this.maxHeight, this.sateData, QuestionImageView(this.maxWidth, this.maxHeight, this.sateData, this.annotationState, this.logic, {super.key});
this.annotationState, this.logic,
{super.key});
/// ///
int _findTargetIndex<T>(List<T> list, T target, [int reciprocal = 2]) { int _findTargetIndex<T>(List<T> list, T target, [int reciprocal = 2]) {
@ -529,8 +456,7 @@ class QuestionImageView extends HookWidget
}, []); }, []);
ImageStream? imageStream; ImageStream? imageStream;
var imageStreamListener = useState<ImageStreamListener>( var imageStreamListener = useState<ImageStreamListener>(ImageStreamListener((ImageInfo info, bool _) {
ImageStreamListener((ImageInfo info, bool _) {
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
sateData.imageScale.value = TestQuestionsImageInfo( sateData.imageScale.value = TestQuestionsImageInfo(
templateId: sateData.data.value?.templateId, templateId: sateData.data.value?.templateId,
@ -553,16 +479,9 @@ class QuestionImageView extends HookWidget
bool? res = await showDialog<bool>( bool? res = await showDialog<bool>(
context: context, context: context,
builder: (context1) { builder: (context1) {
return AlertDialog( return AlertDialog(content: quickText("是否撤销全部批注痕迹?"), actions: <Widget>[
content: quickText("是否撤销全部批注痕迹?"), TextButton(child: quickText("取消"), onPressed: () => Navigator.pop(context1, false)),
actions: <Widget>[ TextButton(child: quickText("确定", color: Theme.of(context).primaryColor), onPressed: () => Navigator.pop(context1, true))
TextButton(
child: quickText("取消"),
onPressed: () => Navigator.pop(context1, false)),
TextButton(
child: quickText("确定",
color: Theme.of(context).primaryColor),
onPressed: () => Navigator.pop(context1, true))
]); ]);
}, },
); );
@ -573,15 +492,10 @@ class QuestionImageView extends HookWidget
await showDialog<bool>( await showDialog<bool>(
context: context, context: context,
builder: (context1) { builder: (context1) {
return AlertDialog( return AlertDialog(content: quickText("是否撤销上次批阅批注痕迹?"), actions: <Widget>[
content: quickText("是否撤销上次批阅批注痕迹?"), TextButton(child: quickText("取消"), onPressed: () => Navigator.pop(context1, false)),
actions: <Widget>[
TextButton( TextButton(
child: quickText("取消"), child: quickText("确定", color: Theme.of(context).primaryColor),
onPressed: () => Navigator.pop(context1, false)),
TextButton(
child: quickText("确定",
color: Theme.of(context).primaryColor),
onPressed: () { onPressed: () {
Navigator.pop(context1, true); Navigator.pop(context1, true);
sateData.data.value?.zgtAnnotate = null; sateData.data.value?.zgtAnnotate = null;
@ -603,15 +517,10 @@ class QuestionImageView extends HookWidget
await showDialog<bool>( await showDialog<bool>(
context: context, context: context,
builder: (context1) { builder: (context1) {
return AlertDialog( return AlertDialog(content: quickText("是否撤销上次批阅批注痕迹?"), actions: <Widget>[
content: quickText("是否撤销上次批阅批注痕迹?"), TextButton(child: quickText("取消"), onPressed: () => Navigator.pop(context1, false)),
actions: <Widget>[
TextButton( TextButton(
child: quickText("取消"), child: quickText("确定", color: Theme.of(context).primaryColor),
onPressed: () => Navigator.pop(context1, false)),
TextButton(
child: quickText("确定",
color: Theme.of(context).primaryColor),
onPressed: () { onPressed: () {
Navigator.pop(context1, true); Navigator.pop(context1, true);
sateData.data.value?.zgtAnnotate = null; sateData.data.value?.zgtAnnotate = null;
@ -639,8 +548,7 @@ class QuestionImageView extends HookWidget
}); // }); //
var listenVal = sateData.slide.listen((e) { var listenVal = sateData.slide.listen((e) {
if (e != scrollControllerQuestion.offset && if (e != scrollControllerQuestion.offset && sateData.panQuestView == false) scrollControllerQuestion.jumpTo(e);
sateData.panQuestView == false) scrollControllerQuestion.jumpTo(e);
}); });
// //
@ -664,19 +572,12 @@ class QuestionImageView extends HookWidget
onPanDown: (_) => sateData.panQuestView = true, onPanDown: (_) => sateData.panQuestView = true,
child: SingleChildScrollView( child: SingleChildScrollView(
controller: scrollControllerQuestion, controller: scrollControllerQuestion,
physics: !annotationState.pen.value physics: !annotationState.pen.value ? const BouncingScrollPhysics() : const NeverScrollableScrollPhysics(),
? const BouncingScrollPhysics()
: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
scrollDirection: Axis.vertical, // scrollDirection: Axis.vertical, //
child: Container( child: Container(
decoration: BoxDecoration(boxShadow: [ decoration: BoxDecoration(
BoxShadow( boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.2), offset: Offset(-6.r, 1.r), blurRadius: 10.r, spreadRadius: 8.r)]),
color: Colors.grey.withOpacity(0.2),
offset: Offset(-6.r, 1.r),
blurRadius: 10.r,
spreadRadius: 8.r)
]),
child: Listener( child: Listener(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onPointerDown: (PointerDownEvent event) { onPointerDown: (PointerDownEvent event) {
@ -703,11 +604,9 @@ class QuestionImageView extends HookWidget
if (imageScale == null || !annotationState.pen.value) return; if (imageScale == null || !annotationState.pen.value) return;
Offset localPosition = event.localPosition; Offset localPosition = event.localPosition;
var dy = localPosition.dy; var dy = localPosition.dy;
if (dy > imageScale.actualImgHeight || dy < 0) if (dy > imageScale.actualImgHeight || dy < 0) return; //
return; //
vnHandWritings.value = List.from(vnHandWritings.value) vnHandWritings.value = List.from(vnHandWritings.value)..add(localPosition);
..add(localPosition);
sateData.handwritings = vnHandWritings.value; sateData.handwritings = vnHandWritings.value;
}, },
child: Stack( child: Stack(
@ -715,12 +614,9 @@ class QuestionImageView extends HookWidget
$TheCachedNetworkImage( $TheCachedNetworkImage(
imageUrl: imageUrl, imageUrl: imageUrl,
(context, imageProvider) { (context, imageProvider) {
Image imageWidget = Image imageWidget = Image(image: imageProvider, fit: BoxFit.fitWidth);
Image(image: imageProvider, fit: BoxFit.fitWidth);
imageStream?.removeListener(imageStreamListener.value); imageStream?.removeListener(imageStreamListener.value);
imageStream = imageWidget.image imageStream = imageWidget.image.resolve(const ImageConfiguration())..addListener(imageStreamListener.value);
.resolve(const ImageConfiguration())
..addListener(imageStreamListener.value);
return imageWidget; return imageWidget;
}, },
), ),
@ -735,8 +631,7 @@ class QuestionImageView extends HookWidget
child: showZgtAnnotate != null child: showZgtAnnotate != null
? $TheCachedNetworkImage( ? $TheCachedNetworkImage(
imageUrl: showZgtAnnotate, imageUrl: showZgtAnnotate,
(_, imageProvider) => Image( (_, imageProvider) => Image(image: imageProvider, fit: BoxFit.fitWidth),
image: imageProvider, fit: BoxFit.fitWidth),
) )
: null, : null,
), ),
@ -768,8 +663,7 @@ class DrawingPainter extends CustomPainter {
for (int i = 0; i < pointsLength; i++) { for (int i = 0; i < pointsLength; i++) {
Offset? offsetData = points[i]; Offset? offsetData = points[i];
Offset? nextOffsetData = pointsLength - 1 == i ? null : points[i + 1]; Offset? nextOffsetData = pointsLength - 1 == i ? null : points[i + 1];
if (offsetData != null && nextOffsetData != null) if (offsetData != null && nextOffsetData != null) canvas.drawLine(offsetData, nextOffsetData, paintBrush);
canvas.drawLine(offsetData, nextOffsetData, paintBrush);
} }
} }

View File

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'dart:ui' as ui; import 'dart:ui' as ui;
@ -15,6 +16,7 @@ import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dar
import 'package:making_school_asignment_app/common/utils/toast_utils.dart'; import 'package:making_school_asignment_app/common/utils/toast_utils.dart';
import 'package:making_school_asignment_app/common/utils/upload_oss_img_utils.dart'; import 'package:making_school_asignment_app/common/utils/upload_oss_img_utils.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
import 'package:making_school_asignment_app/page/home_page/children/job_report/widget/personnel_data_overview.dart';
// //
class HomeworkReviewState { class HomeworkReviewState {
@ -61,8 +63,7 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
late StreamSubscription<DoPaperDetailsParam> _paramListen; late StreamSubscription<DoPaperDetailsParam> _paramListen;
late StreamSubscription<DoPaperDetailsResult?> _dataListen; late StreamSubscription<DoPaperDetailsResult?> _dataListen;
final HomeworkReviewState state = HomeworkReviewState(); final HomeworkReviewState state = HomeworkReviewState();
final HomeworkReviewAnnotationsControlState annotationState = final HomeworkReviewAnnotationsControlState annotationState = HomeworkReviewAnnotationsControlState();
HomeworkReviewAnnotationsControlState();
@override @override
void onInit() { void onInit() {
@ -92,11 +93,9 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
} }
void getData() async { void getData() async {
var timerControl = Timer( var timerControl = Timer(const Duration(milliseconds: 300), () => ToastUtils.showLoading());
const Duration(milliseconds: 300), () => ToastUtils.showLoading());
try { try {
DoPaperDetailsResult? data = DoPaperDetailsResult? data = await getClient().getDoPaperDetails(state.param.value);
await getClient().getDoPaperDetails(state.param.value);
// var studentQuestions = data.studentQuestions; // var studentQuestions = data.studentQuestions;
// // 0 // // 0
// for (var i = 0; i < studentQuestions.length; i++) { // for (var i = 0; i < studentQuestions.length; i++) {
@ -108,6 +107,8 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
state.data.value = data; state.data.value = data;
state.handwritings = []; state.handwritings = [];
state.studentQuestions.value = data.studentQuestions; state.studentQuestions.value = data.studentQuestions;
} catch (e) { } catch (e) {
print('获取数据报错了:$e'); print('获取数据报错了:$e');
ToastUtils.showError('获取试题数据出错,请重试'); ToastUtils.showError('获取试题数据出错,请重试');
@ -117,6 +118,7 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
ToastUtils.dismiss(); ToastUtils.dismiss();
} }
} }
// //
@ -168,16 +170,12 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
if (data == null) return null; if (data == null) return null;
// OSS url // OSS url
String imgKey = UploadOssImgUtils.getInstance().setImgKey( String imgKey = UploadOssImgUtils.getInstance().setImgKey(param.homeworkId, data.studentId.toString(), data.templateId.toString());
param.homeworkId,
data.studentId.toString(),
data.templateId.toString());
var resUrl = await getClient().getOssPresignedUri(imgKey); var resUrl = await getClient().getOssPresignedUri(imgKey);
if (resUrl == null) return null; if (resUrl == null) return null;
// //
RenderRepaintBoundary? boundary = pictureOverviewKey.currentContext! RenderRepaintBoundary? boundary = pictureOverviewKey.currentContext!.findRenderObject() as RenderRepaintBoundary?;
.findRenderObject() as RenderRepaintBoundary?;
if (boundary == null) return null; if (boundary == null) return null;
// double dpr = MediaQuery.of(context).devicePixelRatio; // double dpr = MediaQuery.of(context).devicePixelRatio;
@ -189,20 +187,16 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
} }
ui.Image image = await boundary.toImage(pixelRatio: pixelRatio); ui.Image image = await boundary.toImage(pixelRatio: pixelRatio);
ByteData? byteData = ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png);
await image.toByteData(format: ui.ImageByteFormat.png);
if (byteData == null) return null; if (byteData == null) return null;
Dio dio = Dio(); Dio dio = Dio();
dio.options.contentType = null; dio.options.contentType = null;
List<int> bytes = byteData.buffer List<int> bytes = byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes);
.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes);
await dio.put( await dio.put(
resUrl, resUrl,
data: Stream.fromIterable(bytes.map((e) => [e])), data: Stream.fromIterable(bytes.map((e) => [e])),
options: Options( options: Options(contentType: null, headers: {Headers.contentLengthHeader: bytes.length}),
contentType: null,
headers: {Headers.contentLengthHeader: bytes.length}),
); );
return imgKey; return imgKey;
@ -224,8 +218,7 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
if (state.data.value?.studentQuestions.isEmpty ?? true) return; if (state.data.value?.studentQuestions.isEmpty ?? true) return;
var studentQuestions = state.data.value!.studentQuestions; var studentQuestions = state.data.value!.studentQuestions;
var noRatingElement = var noRatingElement = studentQuestions.firstWhereOrNull((e) => e.studentScore == null);
studentQuestions.firstWhereOrNull((e) => e.studentScore == null);
if (noRatingElement != null) { if (noRatingElement != null) {
ToastUtils.showInfo('${noRatingElement.questionNo}题请评分'); ToastUtils.showInfo('${noRatingElement.questionNo}题请评分');
return; return;
@ -254,7 +247,7 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
.then((e) async { .then((e) async {
state.needRefresh = true; state.needRefresh = true;
var totalUnAnnotateCount = data.totalUnAnnotateCount; var totalUnAnnotateCount = data.totalUnAnnotateCount;
if (data.needAnnotate) totalUnAnnotateCount -= 1; // if (data.annotateTime == null) totalUnAnnotateCount -= 1;
if (totalUnAnnotateCount <= 0 && !state.lastQuestionPrompt) { if (totalUnAnnotateCount <= 0 && !state.lastQuestionPrompt) {
// //
@ -263,7 +256,7 @@ class HomeworkReviewLogic extends GetxController with RequestToolMixin {
builder: (BuildContext context1) { builder: (BuildContext context1) {
return AlertDialog( return AlertDialog(
title: quickText('批阅已完成'), title: quickText('批阅已完成'),
content: const Text('暂无更多批阅项'), content: const Text('暂无更多批阅项'),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
child: const Text('继续'), child: const Text('继续'),

View File

@ -1,12 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:making_school_asignment_app/page/global_widget/ReturnToHomepage.dart'; import 'package:making_school_asignment_app/page/global_widget/ReturnToHomepage.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
import 'package:making_school_asignment_app/page/home_page/children/annotate_class/annotate_class_logic.dart'; import 'package:making_school_asignment_app/page/home_page/children/annotate_class/annotate_class_logic.dart';
import 'package:making_school_asignment_app/page/home_page/home_logic.dart';
import 'components/bottom_operation_bar.dart'; import 'components/bottom_operation_bar.dart';
import 'components/button_floating_action.dart';
import 'components/dropdown_switch_students_type.dart'; import 'components/dropdown_switch_students_type.dart';
import 'components/favorite_widget.dart'; import 'components/favorite_widget.dart';
import 'components/question_paper_view.dart'; import 'components/question_paper_view.dart';
@ -23,7 +24,6 @@ class _HomeworkReviewState extends State<HomeworkReview> {
final logic = Get.find<HomeworkReviewLogic>(); final logic = Get.find<HomeworkReviewLogic>();
final sateData = Get.find<HomeworkReviewLogic>().state; final sateData = Get.find<HomeworkReviewLogic>().state;
final AnnotateClassLogic _controller = Get.find<AnnotateClassLogic>(); final AnnotateClassLogic _controller = Get.find<AnnotateClassLogic>();
final HomeLogic _homeLogicController = Get.find<HomeLogic>();
@override @override
void initState() { void initState() {
@ -42,27 +42,18 @@ class _HomeworkReviewState extends State<HomeworkReview> {
return PopScope( return PopScope(
canPop: false, canPop: false,
onPopInvoked: (e) { onPopInvoked: (e) {
if (e && sateData.needRefresh) { if (e && sateData.needRefresh) _controller.getList();
_controller.getList();
_homeLogicController.getList();
}
}, },
child: SafeArea( child: SafeArea(
child: Scaffold( child: Scaffold(
appBar: AppBar( appBar: AppBar(
// titleSpacing: 0, // titleSpacing: 0,
leading: IconButton( leading: IconButton(icon: const Icon(Icons.arrow_back_ios), onPressed: () => Get.back()),
icon: const Icon(Icons.arrow_back_ios),
onPressed: () => Get.back()),
iconTheme: const IconThemeData(color: Colors.black), iconTheme: const IconThemeData(color: Colors.black),
title: quickText(sateData.param.value.homeworkName), title: quickText(sateData.param.value.homeworkName),
backgroundColor: Colors.white, backgroundColor: Colors.white,
elevation: 0, elevation: 0,
actions: [ actions: [const FavoriteWidget(), SizedBox(width: 5.w), const ReturnToHomepage()],
const FavoriteWidget(),
SizedBox(width: 5.w),
const ReturnToHomepage()
],
), ),
body: SafeArea( body: SafeArea(
child: Column( child: Column(

View File

@ -26,10 +26,7 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
barrierDismissible: false, barrierDismissible: false,
context: context1, context: context1,
builder: (context) { builder: (context) {
return AlertDialog( return AlertDialog(title: quickText("提示信息"), content: quickText("您确定要退出登录吗?"), actions: <Widget>[
title: quickText("提示信息"),
content: quickText("您确定要退出登录吗?"),
actions: <Widget>[
TextButton( TextButton(
child: quickText("取消"), child: quickText("取消"),
onPressed: () { onPressed: () {
@ -38,17 +35,15 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
), ),
TextButton( TextButton(
child: quickText("确定"), child: quickText("确定"),
onPressed: () async { onPressed: () {
try { /* ref.read(markingKeyboardProvider.notifier).clean();
UserStore.to.erase(); ref.read(markingSubtopicSwitchingProvider.notifier).clean();
await StorageService.to.erase(); ref.read(userTokenProvider.notifier).clean();
StorageService.to ref.read(userProvider.notifier).clean();*/
.write(AppStorageKey.privacyAgreement.value, true); StorageService.to.remove(AppStorageKey.token.value);
StorageService.to.remove(AppStorageKey.userInfo.value);
Navigator.pop(context, "Ok"); Navigator.pop(context, "Ok");
Get.offAllNamed(Routes.login); Get.offAllNamed(Routes.login);
} catch (e) {
print(e);
}
}) })
]); ]);
}); });
@ -70,9 +65,15 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
fontSize: 13.sp, fontSize: 13.sp,
); );
return OrientationBuilder( return OrientationBuilder(builder: (BuildContext context, Orientation orientation) {
builder: (BuildContext context, Orientation orientation) { return AnnotatedRegion(
return Stack( value: const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.light,
statusBarBrightness: Brightness.dark,
),
child: Stack(
children: [ children: [
SizedBox( SizedBox(
height: double.infinity, height: double.infinity,
@ -128,8 +129,7 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
margin: EdgeInsets.only(top: 0.h), margin: EdgeInsets.only(top: 0.h),
child: Text( child: Text(
userInfo.value?.name ?? '请前往登录', userInfo.value?.name ?? '请前往登录',
style: TextStyle( style: TextStyle(fontSize: 13.sp, color: Colors.white),
fontSize: 13.sp, color: Colors.white),
), ),
), ),
), ),
@ -144,10 +144,8 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
), ),
SizedBox(height: 14.h), SizedBox(height: 14.h),
Container( Container(
margin: margin: EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w),
EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w), padding: EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w),
padding:
EdgeInsets.symmetric(vertical: 22.h, horizontal: 16.w),
height: 180.h, height: 180.h,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(6.w)), borderRadius: BorderRadius.all(Radius.circular(6.w)),
@ -166,11 +164,7 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
children: [ children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [Text('账号', style: personalInfoTitleStly), Text(userInfo.value?.name ?? '请前往登录', style: personalInfoValStly)],
Text('账号', style: personalInfoTitleStly),
Text(userInfo.value?.name ?? '请前往登录',
style: personalInfoValStly)
],
), ),
Container( Container(
height: 1.w, height: 1.w,
@ -180,8 +174,7 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text('所在学校', style: personalInfoTitleStly), Text('所在学校', style: personalInfoTitleStly),
Text(userInfo.value?.schoolName ?? '', Text(userInfo.value?.schoolName ?? '', style: personalInfoValStly)
style: personalInfoValStly)
], ],
), ),
/* Row( /* Row(
@ -216,9 +209,7 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
) )
], ],
),*/ ),*/
Container( Container(height: 1.w, color: const Color.fromRGBO(240, 243, 255, 1)),
height: 1.w,
color: const Color.fromRGBO(240, 243, 255, 1)),
Padding( Padding(
padding: EdgeInsets.only(top: 10.h), padding: EdgeInsets.only(top: 10.h),
child: InkWell( child: InkWell(
@ -259,8 +250,7 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
color: Colors.white, color: Colors.white,
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: color: const Color.fromRGBO(46, 91, 255, 0.2),
const Color.fromRGBO(46, 91, 255, 0.2),
offset: Offset(2.w, 2.h), //y轴偏移量 offset: Offset(2.w, 2.h), //y轴偏移量
blurRadius: 14, // blurRadius: 14, //
spreadRadius: 0.5, // spreadRadius: 0.5, //
@ -274,18 +264,14 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
Icon( Icon(
Icons.exit_to_app_outlined, Icons.exit_to_app_outlined,
size: 13.sp, size: 13.sp,
color: color: const Color.fromRGBO(148, 163, 182, 1),
const Color.fromRGBO(148, 163, 182, 1),
), ),
Container( Container(
width: 6.w, width: 6.w,
), ),
Text( Text(
'退出登录', '退出登录',
style: TextStyle( style: TextStyle(color: const Color.fromRGBO(148, 163, 182, 1), fontSize: 13.sp),
color: const Color.fromRGBO(
148, 163, 182, 1),
fontSize: 13.sp),
), ),
], ],
), ),
@ -303,6 +289,7 @@ class _MyInfoState extends State<MyInfo> with AutomaticKeepAliveClientMixin {
), ),
), ),
], ],
),
); );
}); });
} }

View File

@ -27,7 +27,9 @@ class ReadOverPage extends StatefulWidget {
class _ReadOverPageState extends State<ReadOverPage> { class _ReadOverPageState extends State<ReadOverPage> {
final logic = Get.find<ReadOverLogic>(); final logic = Get.find<ReadOverLogic>();
final state = Get.find<ReadOverLogic>().state; final state = Get
.find<ReadOverLogic>()
.state;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -37,7 +39,7 @@ class _ReadOverPageState extends State<ReadOverPage> {
systemNavigationBarDividerColor: null, systemNavigationBarDividerColor: null,
statusBarColor: Colors.white, statusBarColor: Colors.white,
systemNavigationBarIconBrightness: Brightness.light, systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.light, statusBarIconBrightness: Brightness.dark,
statusBarBrightness: Brightness.light, statusBarBrightness: Brightness.light,
), ),
child: Scaffold( child: Scaffold(
@ -48,7 +50,10 @@ class _ReadOverPageState extends State<ReadOverPage> {
children: <Widget>[ children: <Widget>[
Container( Container(
color: Colors.white, color: Colors.white,
margin: EdgeInsets.only(top: MediaQuery.of(context).padding.top), margin: EdgeInsets.only(top: MediaQuery
.of(context)
.padding
.top),
padding: EdgeInsets.only(bottom: 9.h, top: 4.h), padding: EdgeInsets.only(bottom: 9.h, top: 4.h),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@ -96,7 +101,9 @@ class _ReadOverPageState extends State<ReadOverPage> {
indicator: const UnderlineTabIndicator( indicator: const UnderlineTabIndicator(
borderSide: BorderSide( borderSide: BorderSide(
width: 0, // 0线 width: 0, // 0线
color: Colors.transparent), color: Colors.transparent
),
), ),
onTap: (index) { onTap: (index) {
state.tabIndex.value = index; state.tabIndex.value = index;
@ -115,14 +122,23 @@ class _ReadOverPageState extends State<ReadOverPage> {
width: 140.w, width: 140.w,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
color: state.tabIndex.value == 0 ? const Color.fromRGBO(255, 255, 255, 1) : null, color: state.tabIndex.value == 0
borderRadius: BorderRadius.all(Radius.circular(8.r)), ? const Color.fromRGBO(
255, 255, 255, 1)
: null,
borderRadius: BorderRadius.all(
Radius.circular(8.r)),
), ),
child: quickText( child: quickText(
'待批阅', '待批阅',
size: 14.sp, size: 14.sp,
color: state.tabIndex.value == 0 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1), color: state.tabIndex.value == 0 ? Theme
fontWeight: state.tabIndex.value == 0 ? FontWeight.bold : null, .of(context)
.primaryColor : const Color.fromRGBO(
80, 94, 110, 1),
fontWeight: state.tabIndex.value == 0
? FontWeight.bold
: null,
), ),
); );
}), }),
@ -135,14 +151,23 @@ class _ReadOverPageState extends State<ReadOverPage> {
width: 140.w, width: 140.w,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
color: state.tabIndex.value == 1 ? const Color.fromRGBO(255, 255, 255, 1) : null, color: state.tabIndex.value == 1
borderRadius: BorderRadius.all(Radius.circular(8.r)), ? const Color.fromRGBO(
255, 255, 255, 1)
: null,
borderRadius: BorderRadius.all(
Radius.circular(8.r)),
), ),
child: quickText( child: quickText(
'已批阅', '已批阅',
size: 14.sp, size: 14.sp,
color: state.tabIndex.value == 1 ? Theme.of(context).primaryColor : const Color.fromRGBO(80, 94, 110, 1), color: state.tabIndex.value == 1 ? Theme
fontWeight: state.tabIndex.value == 1 ? FontWeight.bold : null, .of(context)
.primaryColor : const Color.fromRGBO(
80, 94, 110, 1),
fontWeight: state.tabIndex.value == 1
? FontWeight.bold
: null,
), ),
); );
}), }),
@ -155,22 +180,22 @@ class _ReadOverPageState extends State<ReadOverPage> {
flex: 1, flex: 1,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
Get.toNamed(Routes.studentHistoryWorkPage, arguments: {'page': 'set'}); Get.toNamed(Routes.studentHistoryWorkPage,
arguments: {'page': 'set'});
}, },
child: Icon(const IconData(0xe63e, fontFamily: "AlibabaIcon"), color: const Color.fromRGBO(44, 48, 63, 1), size: 24.sp), child: Icon(
const IconData(0xe63e, fontFamily: "AlibabaIcon"),
color: const Color.fromRGBO(44, 48, 63, 1),
size: 24.sp),
), ),
), ),
], ],
), ),
), ),
Expanded( Expanded(child: Obx(() {
child: Obx(() { return AnnotateList(tabIndex: state.tabIndex.value,assessType: 0,);
return AnnotateList( }),),
tabIndex: state.tabIndex.value,
assessType: 0,
);
}),
),
], ],
); );
}, },

View File

@ -18,7 +18,7 @@ import 'home_logic.dart';
part 'home_view.g.dart'; part 'home_view.g.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
const HomePage({super.key}); const HomePage({Key? key}) : super(key: key);
@override @override
State<HomePage> createState() => _HomePageState(); State<HomePage> createState() => _HomePageState();
@ -31,20 +31,20 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@override
void initState() {
super.initState();
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle(
statusBarIconBrightness: Brightness.dark,
systemStatusBarContrastEnforced: false,
));
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
var spaceWidth = SizedBox(height: ScreenUtil().screenWidth / 30); var spaceWidth = SizedBox(height: ScreenUtil().screenWidth / 30);
return SafeArea( return SafeArea(
child: AnnotatedRegion(
value: const SystemUiOverlayStyle(
systemNavigationBarColor: Color(0xFF000000),
systemNavigationBarDividerColor: null,
statusBarColor: Colors.white,
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.dark,
statusBarBrightness: Brightness.light,
),
child: OrientationBuilder( child: OrientationBuilder(
builder: (BuildContext context, Orientation orientation) { builder: (BuildContext context, Orientation orientation) {
return EasyRefresh( return EasyRefresh(
@ -78,7 +78,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
), ),
), ),
),*/ ),*/
SizedBox(height: MediaQuery.of(context).padding.top / 2), SizedBox(height: MediaQuery. of(context).padding.top / 2),
Obx(() { Obx(() {
return $TermRow([ return $TermRow([
EntranceModel(title: '作业批阅', image: 'assets/images/job_home_marking.png', navigationUrl: Routes.readOverPage), EntranceModel(title: '作业批阅', image: 'assets/images/job_home_marking.png', navigationUrl: Routes.readOverPage),
@ -115,8 +115,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
Obx(() { Obx(() {
return Container( return Container(
padding: EdgeInsets.symmetric(horizontal: 12.w), padding: EdgeInsets.symmetric(horizontal: 12.w),
child: state.workList.isNotEmpty child: state.workList.isNotEmpty?Column(
? Column(
children: List.generate(state.workList.length, (index) { children: List.generate(state.workList.length, (index) {
Items item = state.workList[index]; Items item = state.workList[index];
return InkWell( return InkWell(
@ -168,7 +167,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
bottomRight: Radius.circular(4.r), bottomRight: Radius.circular(4.r),
), ),
), ),
margin: EdgeInsets.only(top: 3.h, right: 4.w), margin: EdgeInsets.only(top:3.h,right: 4.w),
child: quickText(state.type == 1 ? '作业' : '考试', color: Colors.white, size: 10.sp), child: quickText(state.type == 1 ? '作业' : '考试', color: Colors.white, size: 10.sp),
), ),
Expanded( Expanded(
@ -191,8 +190,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
color: const Color.fromRGBO(97, 97, 97, 1), color: const Color.fromRGBO(97, 97, 97, 1),
size: 12.sp, size: 12.sp,
), ),
quickText(' / ', quickText(' / ', color: const Color.fromRGBO(130, 130, 130, 1), size: 11.sp, fontWeight: FontWeight.w500),
color: const Color.fromRGBO(130, 130, 130, 1), size: 11.sp, fontWeight: FontWeight.w500),
Row( Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
@ -204,8 +202,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
), ),
], ],
), ),
quickText(' / ', quickText(' / ', color: const Color.fromRGBO(130, 130, 130, 1), size: 11.sp, fontWeight: FontWeight.w500),
color: const Color.fromRGBO(130, 130, 130, 1), size: 11.sp, fontWeight: FontWeight.w500),
quickText(DateTime.parse(item.publishTime).toString().substring(0, 10), quickText(DateTime.parse(item.publishTime).toString().substring(0, 10),
color: const Color.fromRGBO(97, 97, 97, 1), size: 12.sp), color: const Color.fromRGBO(97, 97, 97, 1), size: 12.sp),
], ],
@ -245,8 +242,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
), ),
); );
}), }),
) ):const MyEmptyWidget(),
: const MyEmptyWidget(),
); );
}), }),
], ],
@ -254,7 +250,7 @@ class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin
); );
}, },
), ),
); ));
} }
@override @override

View File

@ -1,281 +0,0 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:making_school_asignment_app/common/const_text.dart';
import 'package:making_school_asignment_app/common/job/user_register_params.dart';
import 'package:making_school_asignment_app/common/mixins/request_tool_mixin.dart';
import 'package:making_school_asignment_app/common/utils/toast_utils.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
import 'package:making_school_asignment_app/routes/app_pages.dart';
///
class Register extends StatefulWidget {
const Register({super.key});
@override
State<Register> createState() => _RegisterState();
}
class _RegisterState extends State<Register> with RequestToolMixin {
late final FocusNode _theFocus;
late final FocusNode _pwdFocus; //
//
late final TextEditingController _userNameController;
late final TextEditingController _passwordController;
bool readAgreement = false; //
bool _isShowPwd = true;
bool canLogin = true;
@override
void initState() {
super.initState();
_userNameController = TextEditingController();
_passwordController = TextEditingController();
_pwdFocus = FocusNode();
_theFocus = FocusNode();
}
@override
void dispose() {
super.dispose();
_userNameController.dispose();
_passwordController.dispose();
_pwdFocus.dispose();
_theFocus.dispose();
}
void toRegister() async {
if (!canLogin) return;
setState(() => canLogin = false);
void toMsg(msg) {
Future.delayed(Duration.zero, () => ToastUtils.showError(msg));
setState(() => canLogin = true);
}
FocusScope.of(context).requestFocus(_theFocus);
try {
String userName = _userNameController.text.trim();
String userPwd = _passwordController.text.trim();
if (userName == '') return toMsg('请填写用户账号');
if (userPwd == '') return toMsg('请填写密码');
if (userPwd.length < 6) return toMsg('密码长度不得少于6位');
if (!readAgreement) return toMsg('请勾选我已阅读用户协议和隐私协议');
EasyLoading.show(status: 'loading...');
var resultData = await getClient().toRegister(UserRegisterParams(account: userName, password: userPwd));
print(resultData);
// if (resultData.success) return toMsg(resultData.message ?? '注册失败,请重试');
ToastUtils.showSuccess('注册成功,请登录');
//
Future.delayed(Duration.zero, () => Get.back());
} catch (e) {
setState(() => canLogin = true);
} finally {
EasyLoading.dismiss();
}
}
void _showPassword() {
setState(() {
_isShowPwd = !_isShowPwd;
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
FocusScope.of(context).requestFocus(_theFocus);
},
child: AnnotatedRegion(
value: const SystemUiOverlayStyle(
statusBarColor: Colors.transparent,
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.light,
statusBarBrightness: Brightness.dark,
),
child: Scaffold(
backgroundColor: Colors.transparent,
resizeToAvoidBottomInset: false,
body: Stack(
children: [
Container(
width: double.infinity,
height: double.infinity,
alignment: Alignment.center,
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage('assets/images/login_bg.png'),
fit: BoxFit.fill, //
),
),
child: SingleChildScrollView(
child: Column(
children: [
Container(
width: 86.w,
height: 86.w,
alignment: Alignment.center,
child: SizedBox(
height: 86.w,
width: 86.w,
child: Image.asset('assets/images/login_logo.png', fit: BoxFit.cover),
),
),
Container(
margin: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.h),
padding: EdgeInsets.only(top: 34.h, bottom: 16.h, left: 22.w, right: 22.w),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(width: 1.w, color: Colors.white),
borderRadius: BorderRadius.all(Radius.circular(10.w)),
boxShadow: const [
BoxShadow(
color: Color.fromRGBO(46, 91, 255, 0.1),
offset: Offset.zero, //y轴偏移量
blurRadius: 100, //
spreadRadius: 100, //
)
],
),
child: Column(children: [
TextField(
controller: _userNameController,
maxLines: 1,
maxLength: 20,
textInputAction: TextInputAction.next,
onEditingComplete: () {
FocusScope.of(context).requestFocus(_pwdFocus);
},
style: TextStyle(
color: const Color.fromRGBO(80, 87, 103, 1),
fontSize: 15.sp,
),
decoration: InputDecoration(
hintText: "请输入账号",
hintStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(153, 153, 153, 1)),
labelText: "账号",
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
),
),
TextField(
focusNode: _pwdFocus,
controller: _passwordController,
keyboardType: TextInputType.number,
maxLines: 1,
obscureText: _isShowPwd, //
textInputAction: TextInputAction.go,
onSubmitted: (_) => toRegister(),
style: TextStyle(
color: const Color.fromRGBO(80, 87, 103, 1),
fontSize: 15.sp,
),
decoration: InputDecoration(
hintText: "请输入密码",
suffix: GestureDetector(
onTap: _showPassword,
child: Icon(
Icons.remove_red_eye,
color: !_isShowPwd ? Theme.of(context).primaryColor : Colors.grey,
),
),
hintStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(153, 153, 153, 1)),
labelText: "密码",
isDense: true,
labelStyle: TextStyle(fontSize: 16.sp, color: const Color.fromRGBO(148, 163, 182, 1)),
),
),
SizedBox(
height: 12.h,
),
InkWell(
onTap: toRegister,
child: Container(
margin: EdgeInsets.symmetric(vertical: 10.h),
decoration: BoxDecoration(
color: canLogin ? Theme.of(context).primaryColor : Colors.grey,
boxShadow: [
BoxShadow(
color: const Color.fromRGBO(76, 199, 147, 0.5),
offset: Offset(4.w, 6.h), //y轴偏移量
blurRadius: 10, //
spreadRadius: 0.5, //
)
],
borderRadius: BorderRadius.all(
Radius.circular(8.w),
),
),
alignment: Alignment.center,
width: double.infinity,
height: 50.h,
child: Text(
'注 册',
style: TextStyle(fontSize: 16.sp, color: Colors.white),
),
),
),
Row(
children: [
Container(
width: 30.w,
padding: EdgeInsets.only(right: 10.w),
child: Checkbox(
activeColor: Colors.deepOrangeAccent,
checkColor: Colors.white,
value: readAgreement,
onChanged: (value) {
FocusScope.of(context).requestFocus(_pwdFocus);
FocusScope.of(context).requestFocus(_theFocus);
setState(() {
readAgreement = value ?? false;
});
},
),
),
InkWell(
onTap: () {
// RouterManager.router.navigateTo(
// context,
// '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_AGREEMENT.name}',
// transition: getTransition(),
// );
},
child: quickText('我已阅读', size: 11.sp),
),
InkWell(
onTap: () {
Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.USER_AGREEMENT.name});
},
child: quickText(
'《用户协议》',
size: 12.sp,
color: Colors.deepOrangeAccent,
),
),
],
),
]),
)
],
),
)),
Positioned(
top: MediaQuery.of(context).padding.top + 20.r,
left: 20.r,
child: InkWell(
onTap: () => Navigator.pop(context),
child: Icon(Icons.arrow_back_ios_new_rounded, color: Colors.white, size: 24.sp),
),
),
],
),
),
),
);
}
}

View File

@ -1,167 +0,0 @@
import 'dart:io';
import 'package:get/get.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:making_school_asignment_app/common/const_text.dart';
import 'package:making_school_asignment_app/common/store/app_storage_key.dart';
import 'package:making_school_asignment_app/common/utils/storage.dart';
import 'package:making_school_asignment_app/common/utils/utils.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
import 'package:making_school_asignment_app/routes/app_pages.dart';
class Protocol extends Dialog {
final BuildContext context;
const Protocol(this.context, {super.key});
@override
Widget build(BuildContext context) {
return Center(
child: Container(
width: isPad() ? 200.w : 260.w,
height: 400.h,
padding: EdgeInsets.symmetric(vertical: 16.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12.r),
),
child: Column(
children: <Widget>[
quickText('用户协议与隐私政策',
size: 15.sp,
color: const Color.fromRGBO(37, 37, 37, 1),
fontWeight: FontWeight.bold),
Expanded(
child: ListView(
physics: const BouncingScrollPhysics(),
padding: EdgeInsets.fromLTRB(16.w, 14.h, 16.w, 10.h),
children: [
Text.rich(TextSpan(children: [
TextSpan(
text:
'感谢您选择点智学APP ! 我们非常重视您的个人信息和隐私保护。为了更好地保障您的个人权益,在您使用我们的产品前,请务必审慎阅读',
style: TextStyle(
fontSize: 13.sp,
color: const Color.fromRGBO(51, 51, 51, 1)),
),
TextSpan(
text: '《隐私政策》',
style: TextStyle(
fontSize: 13.sp,
color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer()
..onTap = () async {
Get.toNamed(Routes.agreementPage, arguments: {
"type": AGREEMENT_KEY.PRIVACY_GREEMENT.name
});
// RouterManager.router.navigateTo(
// context,
// '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.PRIVACY_GREEMENT.name}',
// transition: getTransition(),
// );
},
),
TextSpan(
text: '',
style: TextStyle(
fontSize: 13.sp,
color: Color.fromRGBO(51, 51, 51, 1)),
),
TextSpan(
text: '《用户协议》',
style: TextStyle(
fontSize: 13.sp,
color: Theme.of(context).primaryColor),
recognizer: TapGestureRecognizer()
..onTap = () async {
Get.toNamed(Routes.agreementPage, arguments: {
"type": AGREEMENT_KEY.USER_AGREEMENT.name
});
// RouterManager.router.navigateTo(
// context,
// '${RouterManager.agreementPath}?type=${AGREEMENT_KEY.USER_AGREEMENT.name}',
// transition: getTransition(),
// );
},
),
TextSpan(
text:
'内的所有条款,尤其是:1.我们对您的个人信息的收集/保存/使用/对外提供/保护等规则条款,以及您的用户权利等条款;2.约定我们的限制责任、免责条款;3.其他以颜色或加粗进行标识的重要条款。如您对以上协议有任何疑问可通过发邮件至yuanxuanjiaoyu@gmail.com与我们联系。您点击"同意并继续”的行为即表示您已阅读完毕并同意以上协议的全部内容。如您同意以上协议内容,请点击"同意并继续”,开始使用我们的产品和服务!',
style: TextStyle(
fontSize: 13.sp,
color: const Color.fromRGBO(51, 51, 51, 1)),
),
])),
],
),
),
SizedBox(height: 10.h),
Row(
children: [
Expanded(
child: InkWell(
onTap: () {
exit(0);
},
child: Container(
alignment: Alignment.center,
padding: EdgeInsets.only(top: 15.h),
decoration: BoxDecoration(
border: Border(
top: BorderSide(
width: 0.5.r,
color: const Color.fromRGBO(238, 238, 238, 1)),
right: BorderSide(
width: 0.5.r,
color: const Color.fromRGBO(238, 238, 238, 1)),
),
),
child: quickText('退出APP', size: 14.sp),
),
),
),
Expanded(
child: InkWell(
onTap: () {
StorageService.to
.write(AppStorageKey.privacyAgreement.value, true);
Navigator.of(context).pop(true);
},
child: Container(
alignment: Alignment.center,
padding: EdgeInsets.only(top: 15.h),
decoration: BoxDecoration(
border: Border(
top: BorderSide(
width: 0.5.r,
color: const Color.fromRGBO(238, 238, 238, 1)),
),
),
child: quickText('同意并继续',
color: Theme.of(context).primaryColor, size: 14.sp),
),
),
)
],
),
],
),
),
);
}
}
///
Future<void> sysProtocol(BuildContext context) async {
bool? sysProtocol =
StorageService.to.hasData(AppStorageKey.privacyAgreement.value);
if (!sysProtocol) {
return showDialog(
context: context,
barrierDismissible: false,
// useRootNavigator: false,
builder: (ctx) => Protocol(ctx),
);
}
}

View File

@ -7,8 +7,8 @@ import 'package:making_school_asignment_app/common/store/user_store.dart';
import 'package:making_school_asignment_app/common/utils/storage.dart'; import 'package:making_school_asignment_app/common/utils/storage.dart';
import 'package:making_school_asignment_app/common/utils/toast_utils.dart'; import 'package:making_school_asignment_app/common/utils/toast_utils.dart';
import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart';
import 'package:making_school_asignment_app/page/login_page/children/sys_protocol.dart';
import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart';
import 'package:making_school_asignment_app/common/utils/storage.dart';
import 'package:making_school_asignment_app/common/store/app_storage_key.dart'; import 'package:making_school_asignment_app/common/store/app_storage_key.dart';
import 'login_state.dart'; import 'login_state.dart';
@ -30,7 +30,7 @@ class LoginLogic extends GetxController with RequestToolMixin {
..addListener(userNameListener); ..addListener(userNameListener);
state.passwordController = TextEditingController();*/ state.passwordController = TextEditingController();*/
String account = StorageService.to.read(AppStorageKey.account.value) ?? ''; String account = StorageService.to.read(AppStorageKey.account.value)?? '';
String pwd = StorageService.to.read(AppStorageKey.pwd.value) ?? ''; String pwd = StorageService.to.read(AppStorageKey.pwd.value) ?? '';
if (account != '' && pwd != '') { if (account != '' && pwd != '') {
state.userNameController.text = account; state.userNameController.text = account;
@ -40,7 +40,6 @@ class LoginLogic extends GetxController with RequestToolMixin {
state.pwdFocus = FocusNode(); state.pwdFocus = FocusNode();
state.theFocus = FocusNode(); state.theFocus = FocusNode();
getShowUserAdditionalFeatures(); //
} }
void userNameListener() { void userNameListener() {
@ -59,7 +58,7 @@ class LoginLogic extends GetxController with RequestToolMixin {
} }
// //
void toLogin(BuildContext context) async { void toLogin() async {
if (!state.canLogin.value) return; if (!state.canLogin.value) return;
state.canLogin.value = false; state.canLogin.value = false;
@ -162,9 +161,4 @@ class LoginLogic extends GetxController with RequestToolMixin {
state.pwdFocus.dispose(); state.pwdFocus.dispose();
state.theFocus.dispose(); state.theFocus.dispose();
} }
///
Future<void> getShowUserAdditionalFeatures() async {
// state.showUserAdditionalFeatures.value = ;
}
} }

View File

@ -15,6 +15,5 @@ class LoginState {
late RxBool isShowPwd = true.obs; late RxBool isShowPwd = true.obs;
late RxBool keepPwd = false.obs; late RxBool keepPwd = false.obs;
late RxBool canLogin = true.obs; late RxBool canLogin = true.obs;
late RxBool readAgreement = false.obs; late RxBool readAgreement = true.obs;
late RxBool showUserAdditionalFeatures = false.obs;
} }

View File

@ -1,18 +1,17 @@
import 'package:get/get.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:making_school_asignment_app/common/const_text.dart'; import 'package:making_school_asignment_app/common/const_text.dart';
import 'package:making_school_asignment_app/common/utils/app_upgrade/upgradeLogic.dart'; import 'package:making_school_asignment_app/common/utils/app_upgrade/upgradeLogic.dart';
import 'package:making_school_asignment_app/common/utils/utils.dart'; import 'package:making_school_asignment_app/common/utils/utils.dart';
import 'package:making_school_asignment_app/page/global_widget/my_text.dart'; import 'package:making_school_asignment_app/page/global_widget/my_text.dart';
import 'package:making_school_asignment_app/routes/app_pages.dart'; import 'package:making_school_asignment_app/routes/app_pages.dart';
import 'children/sys_protocol.dart';
import 'login_logic.dart'; import 'login_logic.dart';
class LoginPage extends StatefulWidget { class LoginPage extends StatefulWidget {
const LoginPage({super.key}); const LoginPage({Key? key}) : super(key: key);
@override @override
State<LoginPage> createState() => _LoginPageState(); State<LoginPage> createState() => _LoginPageState();
@ -25,10 +24,7 @@ class _LoginPageState extends State<LoginPage> {
@override @override
void initState() { void initState() {
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(statusBarIconBrightness: Brightness.light));
Future.delayed(Duration.zero, () => upgradeLogic.getAppUpgrade(context)); Future.delayed(Duration.zero, () => upgradeLogic.getAppUpgrade(context));
Future.delayed(Duration.zero, () => sysProtocol(context));
super.initState(); super.initState();
} }
@ -40,8 +36,6 @@ class _LoginPageState extends State<LoginPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setSystemUIOverlayStyle(
const SystemUiOverlayStyle(statusBarIconBrightness: Brightness.light));
return GestureDetector( return GestureDetector(
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
onTap: () { onTap: () {
@ -78,15 +72,12 @@ class _LoginPageState extends State<LoginPage> {
child: SizedBox( child: SizedBox(
height: 86.w, height: 86.w,
width: 86.w, width: 86.w,
child: Image.asset('assets/images/login_logo.png', child: Image.asset('assets/images/login_logo.png', fit: BoxFit.cover),
fit: BoxFit.cover),
), ),
), ),
Container( Container(
margin: EdgeInsets.symmetric( margin: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.h),
horizontal: 32.w, vertical: 24.h), padding: EdgeInsets.only(top: 34.h, bottom: 16.h, left: 22.w, right: 22.w),
padding: EdgeInsets.only(
top: 34.h, bottom: 16.h, left: 22.w, right: 22.w),
color: Colors.transparent, color: Colors.transparent,
/* decoration: BoxDecoration( /* decoration: BoxDecoration(
color: Colors.transparent, color: Colors.transparent,
@ -106,10 +97,8 @@ class _LoginPageState extends State<LoginPage> {
padding: EdgeInsets.symmetric(horizontal: 20.h), padding: EdgeInsets.symmetric(horizontal: 20.h),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.transparent, color: Colors.transparent,
border: Border.all( border: Border.all(width: 1.w, color: const Color(0xFFFFFFFF)),
width: 1.w, color: const Color(0xFFFFFFFF)), borderRadius: BorderRadius.all(Radius.circular(17.w)),
borderRadius:
BorderRadius.all(Radius.circular(17.w)),
), ),
child: TextField( child: TextField(
controller: state.userNameController, controller: state.userNameController,
@ -138,7 +127,7 @@ class _LoginPageState extends State<LoginPage> {
border: InputBorder.none, border: InputBorder.none,
isDense: true, isDense: true,
prefixIconConstraints: BoxConstraints( prefixIconConstraints: BoxConstraints(
minHeight: 10.w, minHeight:10.w,
minWidth: 10.h, minWidth: 10.h,
), ),
prefixIcon: Padding( prefixIcon: Padding(
@ -160,10 +149,8 @@ class _LoginPageState extends State<LoginPage> {
padding: EdgeInsets.symmetric(horizontal: 20.h), padding: EdgeInsets.symmetric(horizontal: 20.h),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.transparent, color: Colors.transparent,
border: Border.all( border: Border.all(width: 1.w, color: const Color(0xFFFFFFFF)),
width: 1.w, color: const Color(0xFFFFFFFF)), borderRadius: BorderRadius.all(Radius.circular(17.w)),
borderRadius:
BorderRadius.all(Radius.circular(17.w)),
), ),
child: TextField( child: TextField(
focusNode: state.pwdFocus, focusNode: state.pwdFocus,
@ -181,7 +168,7 @@ class _LoginPageState extends State<LoginPage> {
decoration: InputDecoration( decoration: InputDecoration(
hintText: "请输入密码", hintText: "请输入密码",
prefixIconConstraints: BoxConstraints( prefixIconConstraints: BoxConstraints(
minHeight: 10.w, minHeight:10.w,
minWidth: 10.h, minWidth: 10.h,
), ),
prefixIcon: Padding( prefixIcon: Padding(
@ -193,20 +180,17 @@ class _LoginPageState extends State<LoginPage> {
), ),
), ),
suffixIconConstraints: BoxConstraints( suffixIconConstraints: BoxConstraints(
minHeight: 10.w, minHeight:10.w,
minWidth: 10.h, minWidth: 10.h,
), ),
suffixIcon: InkWell( suffixIcon: InkWell(
onTap: () { onTap: (){
state.isShowPwd.value = state.isShowPwd.value = !state.isShowPwd.value;
!state.isShowPwd.value;
}, },
child: Padding( child: Padding(
padding: EdgeInsets.only(right: 5.r), padding: EdgeInsets.only(right: 5.r),
child: Image.asset( child: Image.asset(
state.isShowPwd.value state.isShowPwd.value ? 'assets/images/eye_default.png':'assets/images/eye_active.png',
? 'assets/images/eye_default.png'
: 'assets/images/eye_active.png',
width: 15.r, width: 15.r,
height: 15.r, height: 15.r,
), ),
@ -227,11 +211,10 @@ class _LoginPageState extends State<LoginPage> {
), ),
); );
}), }),
SizedBox(height: 10.h), SizedBox(
height: 22.h,
),
Row( Row(
children: [
Expanded(
child: Row(
children: [ children: [
Container( Container(
width: 25.w, width: 25.w,
@ -240,38 +223,18 @@ class _LoginPageState extends State<LoginPage> {
return Transform.scale( return Transform.scale(
scale: 1.2, scale: 1.2,
child: Checkbox( child: Checkbox(
// activeColor: Colors.transparent, // activeColor: Theme.of(context).primaryColor,
checkColor: Colors.white,
activeColor:
Theme.of(context).primaryColor,
// checkColor: Colors.white,
value: state.keepPwd.value, value: state.keepPwd.value,
onChanged: (value) { onChanged: (value) {
// Get.focusScope?.nextFocus(); // Get.focusScope?.nextFocus();
FocusScope.of(context) FocusScope.of(context).requestFocus(
.requestFocus(state.pwdFocus); state.pwdFocus);
FocusScope.of(context) FocusScope.of(context).requestFocus(
.requestFocus(state.theFocus); state.theFocus);
state.keepPwd.value = state.keepPwd.value = value ?? false;
value ?? false;
}, },
side: WidgetStateBorderSide ),
.resolveWith(
(Set<WidgetState> states) {
if (states.contains(
WidgetState.selected)) {
//
return BorderSide(
width: 1.5.r,
color: Theme.of(context)
.primaryColor);
}
//绿
return BorderSide(
width: 1.5.r,
color: Colors.white);
},
)),
); );
}), }),
), ),
@ -280,46 +243,35 @@ class _LoginPageState extends State<LoginPage> {
Utils.hideKeyboard(); Utils.hideKeyboard();
Get.focusScope?.nextFocus(); Get.focusScope?.nextFocus();
Get.focusScope?.nextFocus(); Get.focusScope?.nextFocus();
FocusScope.of(context) FocusScope.of(context).requestFocus(
.requestFocus(state.pwdFocus); state.pwdFocus);
FocusScope.of(context) FocusScope.of(context).requestFocus(
.requestFocus(state.theFocus); state.theFocus);
state.keepPwd.value = state.keepPwd.value = !state.keepPwd.value;
!state.keepPwd.value;
}, },
child: Text( child: Text(
'记住密码', '记住密码',
style: TextStyle( style: TextStyle(
fontSize: 12.sp, fontSize: 11.sp,
color: Colors.white, color: Colors.white,
), ),
), ),
), ),
], ],
), ),
),
InkWell(
onTap: () => Get.toNamed(Routes.register),
child: quickText('账号注册', color: Colors.white),
)
],
),
InkWell( InkWell(
onTap: () { onTap: () {
logic.toLogin(context); logic.toLogin();
// Get.toNamed(Routes.home); // Get.toNamed(Routes.home);
}, },
child: Obx(() { child: Obx(() {
return Container( return Container(
margin: EdgeInsets.symmetric(vertical: 10.h), margin: EdgeInsets.symmetric(vertical: 10.h),
decoration: BoxDecoration( decoration: BoxDecoration(
color: state.canLogin.value color: state.canLogin.value ? const Color(0xFF4CC793) : const Color(0xFFdddddd),
? const Color(0xFF4CC793)
: const Color(0xFFdddddd),
boxShadow: [ boxShadow: [
BoxShadow( BoxShadow(
color: color: const Color.fromRGBO(76, 199, 147, 0.5),
const Color.fromRGBO(76, 199, 147, 0.5),
offset: Offset(6.w, 10.h), //y轴偏移量 offset: Offset(6.w, 10.h), //y轴偏移量
blurRadius: 14, // blurRadius: 14, //
spreadRadius: 0.5, // spreadRadius: 0.5, //
@ -332,9 +284,10 @@ class _LoginPageState extends State<LoginPage> {
alignment: Alignment.center, alignment: Alignment.center,
width: double.infinity, width: double.infinity,
height: 50.h, height: 50.h,
child: Text('登 录', child: Text(
style: TextStyle( '登 录',
fontSize: 16.sp, color: Colors.white)), style: TextStyle(fontSize: 16.sp, color: Colors.white),
),
); );
}), }),
), ),
@ -356,50 +309,25 @@ class _LoginPageState extends State<LoginPage> {
state.pwdFocus); state.pwdFocus);
FocusScope.of(context).requestFocus( FocusScope.of(context).requestFocus(
state.theFocus);*/ state.theFocus);*/
state.readAgreement.value = state.readAgreement.value = value ?? false;
value ?? false;
}, },
side: WidgetStateBorderSide.resolveWith(
(Set<WidgetState> states) {
if (states
.contains(WidgetState.selected)) {
//
return BorderSide(
width: 1.5.r,
color: Theme.of(context)
.primaryColor);
}
//绿
return BorderSide(
width: 1.5.r, color: Colors.white);
},
),
), ),
); );
}), }),
), ),
InkWell( InkWell(
onTap: () { onTap: () {
Get.toNamed(Routes.agreementPage, arguments: { Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.USER_AGREEMENT.name});
"type": AGREEMENT_KEY.USER_AGREEMENT.name
});
}, },
child: quickText( child: quickText('请仔细阅读', size: 11.sp,),
'请仔细阅读',
size: 11.sp,
),
), ),
InkWell( InkWell(
onTap: () { onTap: () {
Get.toNamed(Routes.agreementPage, arguments: { Get.toNamed(Routes.agreementPage, arguments: {"type": AGREEMENT_KEY.USER_AGREEMENT.name});
"type": AGREEMENT_KEY.USER_AGREEMENT.name
});
}, },
child: Text( child: Text(
'《用户协议》', '《用户协议》',
style: TextStyle( style: TextStyle(fontSize: 12.r, color: Colors.deepOrangeAccent),
fontSize: 12.r,
color: Theme.of(context).primaryColor),
), ),
), ),
], ],

View File

@ -27,21 +27,19 @@ class _WorkPageState extends State<WorkPage> with AutomaticKeepAliveClientMixin
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@override
void initState() {
// TODO: implement initState
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
super.build(context); super.build(context);
return AnnotatedRegion(
SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( value: const SystemUiOverlayStyle(
systemNavigationBarColor: Color(0xFF000000),
systemNavigationBarDividerColor: null,
statusBarColor: Colors.white,
systemNavigationBarIconBrightness: Brightness.light,
statusBarIconBrightness: Brightness.dark, statusBarIconBrightness: Brightness.dark,
systemStatusBarContrastEnforced: false, statusBarBrightness: Brightness.light,
)); ),
return Scaffold( child: Scaffold(
backgroundColor: const Color.fromRGBO(244, 244, 244, 1), backgroundColor: const Color.fromRGBO(244, 244, 244, 1),
body: OrientationBuilder( body: OrientationBuilder(
builder: (BuildContext context, Orientation orientation) { builder: (BuildContext context, Orientation orientation) {
@ -162,6 +160,7 @@ class _WorkPageState extends State<WorkPage> with AutomaticKeepAliveClientMixin
); );
}, },
), ),
),
); );
} }

View File

@ -35,7 +35,6 @@ import 'package:making_school_asignment_app/page/home_page/children/student_work
import 'package:making_school_asignment_app/page/home_page/home_binding.dart'; import 'package:making_school_asignment_app/page/home_page/home_binding.dart';
import 'package:making_school_asignment_app/page/home_page/home_view.dart'; import 'package:making_school_asignment_app/page/home_page/home_view.dart';
import 'package:making_school_asignment_app/page/login_page/children/agreement_page.dart'; import 'package:making_school_asignment_app/page/login_page/children/agreement_page.dart';
import 'package:making_school_asignment_app/page/login_page/children/register.dart';
import 'package:making_school_asignment_app/page/login_page/login_binding.dart'; import 'package:making_school_asignment_app/page/login_page/login_binding.dart';
import 'package:making_school_asignment_app/page/login_page/login_view.dart'; import 'package:making_school_asignment_app/page/login_page/login_view.dart';
import 'package:making_school_asignment_app/page/work_page/work_binding.dart'; import 'package:making_school_asignment_app/page/work_page/work_binding.dart';
@ -45,7 +44,6 @@ part 'app_routes.dart';
abstract class AppPages { abstract class AppPages {
static final pages = [ static final pages = [
GetPage(name: Routes.login, page: () => const LoginPage(), binding: LoginBinding(), transition: Transition.noTransition), GetPage(name: Routes.login, page: () => const LoginPage(), binding: LoginBinding(), transition: Transition.noTransition),
GetPage(name: Routes.register, page: () => const Register(), transition: getTransition()),
GetPage(name: Routes.agreementPage, page: () => const AgreementPage(), binding: LoginBinding(), transition: Transition.noTransition), GetPage(name: Routes.agreementPage, page: () => const AgreementPage(), binding: LoginBinding(), transition: Transition.noTransition),
GetPage(name: Routes.home, page: () => const HomePage(), binding: HomeBinding(), transition: Transition.noTransition), GetPage(name: Routes.home, page: () => const HomePage(), binding: HomeBinding(), transition: Transition.noTransition),
GetPage(name: Routes.startPage, page: () => const StartPage(), binding: StartPageIndexBinding(), transition: Transition.noTransition), GetPage(name: Routes.startPage, page: () => const StartPage(), binding: StartPageIndexBinding(), transition: Transition.noTransition),
@ -87,20 +85,14 @@ abstract class AppPages {
page: () => const KnowledgePointsGraspDetailPage(), page: () => const KnowledgePointsGraspDetailPage(),
binding: KnowledgePointsGraspDetailBinding(), binding: KnowledgePointsGraspDetailBinding(),
transition: Transition.noTransition), transition: Transition.noTransition),
GetPage( GetPage(name: Routes.answerTrajectoryPage, page: () => const AnswerTrajectoryPage(), binding: AnswerTrajectoryBinding(), transition: Transition.noTransition),
name: Routes.answerTrajectoryPage, GetPage(name: Routes.answerTrajectoryDetailPage, page: () => const AnswerTrajectoryDetailPage(), binding: AnswerTrajectoryDetailBinding(), transition: Transition.noTransition),
page: () => const AnswerTrajectoryPage(),
binding: AnswerTrajectoryBinding(),
transition: Transition.noTransition),
GetPage(
name: Routes.answerTrajectoryDetailPage,
page: () => const AnswerTrajectoryDetailPage(),
binding: AnswerTrajectoryDetailBinding(),
transition: Transition.noTransition),
// //
GetPage(name: Routes.reviewHomework, page: () => const HomeworkReview(), binding: HomeworkReviewBinding(), transition: getTransition()), GetPage(name: Routes.reviewHomework, page: () => const HomeworkReview(), binding: HomeworkReviewBinding(), transition: getTransition()),
GetPage(name: Routes.reviewExam, page: () => const HomeworkReview(), binding: HomeworkReviewBinding(), transition: getTransition()), GetPage(name: Routes.reviewExam, page: () => const HomeworkReview(), binding: HomeworkReviewBinding(), transition: getTransition()),
GetPage(name: Routes.favStudentPage, page: () => const FavStudentPage(), binding: FavStudentBinding(), transition: Transition.noTransition), GetPage(name: Routes.favStudentPage, page: () => const FavStudentPage(), binding: FavStudentBinding(), transition: Transition.noTransition),
]; ];
} }

View File

@ -2,7 +2,6 @@ part of 'app_pages.dart';
abstract class Routes { abstract class Routes {
static const login = '/login'; static const login = '/login';
static const register = '/register';
static const agreementPage = '/agreementPage'; static const agreementPage = '/agreementPage';
static const home = '/home'; static const home = '/home';
static const startPage = '/startPage'; static const startPage = '/startPage';
@ -25,4 +24,5 @@ abstract class Routes {
static const reviewHomework = '/review/reviewHomework'; // static const reviewHomework = '/review/reviewHomework'; //
static const reviewExam = '/review/reviewExam'; // static const reviewExam = '/review/reviewExam'; //
static const favStudentPage = '/favStudentPage'; // static const favStudentPage = '/favStudentPage'; //
} }

View File

@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.0.1+2 version: 1.0.0+1
environment: environment:
sdk: '>=3.4.1 <4.0.0' sdk: '>=3.4.1 <4.0.0'
@ -91,12 +91,9 @@ dependencies:
url_launcher: ^6.1.11 url_launcher: ^6.1.11
app_installer: ^1.1.0 app_installer: ^1.1.0
auto_updater: ^0.2.1 auto_updater: ^0.2.1
permission_handler: ^11.3.1 permission_handler: ^11.0.1
flutter_distributor: ^0.4.5 flutter_distributor: ^0.4.5
flutter_native_splash: ^2.4.1 flutter_native_splash: ^2.4.1
icons_launcher: ^2.1.7
app_settings: ^5.1.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
@ -163,11 +160,3 @@ flutter:
# #
# For details regarding fonts from package dependencies, # For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages # see https://flutter.dev/custom-fonts/#from-packages
icons_launcher:
platforms:
android:
enable: false
ios:
enable: true
image_path: "assets/images/logo_splash.png"

View File

@ -120,43 +120,6 @@
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
@ -186,7 +149,8 @@
body { body {
margin: 0; margin: 0;
min-height: 100%; min-height: 100%;
background-color: #eeeeee; background-color: #ffffff;
background-image: url("splash/img/light-background.png");
background-size: 100% 100%; background-size: 100% 100%;
} }
@ -243,18 +207,13 @@
document.body.style.background = "transparent"; document.body.style.background = "transparent";
} }
</script> </script>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" name="viewport">
</head> </head>
<body> <body>
<script src="flutter_bootstrap.js" async=""></script> <script src="flutter_bootstrap.js" async=""></script>