Commit 68a4c50a70db6f568d0977212e4a9be36a82b573
Merge remote-tracking branch 'origin/feat-wqf-payment' into xiaoyu_cocossteve
添加带参数打开游戏
Showing
90 changed files
with
2710 additions
and
1097 deletions
android/app/build.gradle
@@ -29,7 +29,7 @@ android { | @@ -29,7 +29,7 @@ android { | ||
29 | namespace "com.kouyuxingqiu.wow_english" | 29 | namespace "com.kouyuxingqiu.wow_english" |
30 | // compileSdkVersion flutter.compileSdkVersion | 30 | // compileSdkVersion flutter.compileSdkVersion |
31 | compileSdkVersion 33 | 31 | compileSdkVersion 33 |
32 | - // 展示没有ndk需求 | 32 | + // 暂时没有ndk需求 |
33 | // ndkVersion flutter.ndkVersion | 33 | // ndkVersion flutter.ndkVersion |
34 | 34 | ||
35 | compileOptions { | 35 | compileOptions { |
@@ -87,4 +87,5 @@ dependencies { | @@ -87,4 +87,5 @@ dependencies { | ||
87 | implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2' | 87 | implementation 'com.geyifeng.immersionbar:immersionbar:3.2.2' |
88 | // kotlin扩展(可选) | 88 | // kotlin扩展(可选) |
89 | implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.2' | 89 | implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.2' |
90 | + implementation 'io.keyss.android.library:bjgame:1.0.2' | ||
90 | } | 91 | } |
android/app/src/main/kotlin/com/kouyuxingqiu/wow_english/MainActivity.kt
@@ -8,6 +8,7 @@ import androidx.core.view.WindowInsetsCompat | @@ -8,6 +8,7 @@ import androidx.core.view.WindowInsetsCompat | ||
8 | import androidx.core.view.WindowInsetsControllerCompat | 8 | import androidx.core.view.WindowInsetsControllerCompat |
9 | import com.gyf.immersionbar.BarHide | 9 | import com.gyf.immersionbar.BarHide |
10 | import com.gyf.immersionbar.ImmersionBar | 10 | import com.gyf.immersionbar.ImmersionBar |
11 | +import com.kouyuxingqiu.wow_english.methodChannels.GameMethodChannel | ||
11 | import com.kouyuxingqiu.wow_english.methodChannels.SingSoungMethodChannel | 12 | import com.kouyuxingqiu.wow_english.methodChannels.SingSoungMethodChannel |
12 | import io.flutter.embedding.android.FlutterActivity | 13 | import io.flutter.embedding.android.FlutterActivity |
13 | 14 | ||
@@ -17,7 +18,10 @@ class MainActivity : FlutterActivity() { | @@ -17,7 +18,10 @@ class MainActivity : FlutterActivity() { | ||
17 | Log.i("WowEnglish", "MainActivity onCreate") | 18 | Log.i("WowEnglish", "MainActivity onCreate") |
18 | //隐藏状态栏和导航栏 | 19 | //隐藏状态栏和导航栏 |
19 | ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_BAR).init() | 20 | ImmersionBar.with(this).hideBar(BarHide.FLAG_HIDE_BAR).init() |
20 | - flutterEngine?.let { SingSoungMethodChannel(this, it) } | 21 | + flutterEngine?.let { |
22 | + SingSoungMethodChannel(this, it) | ||
23 | + GameMethodChannel(this, it) | ||
24 | + } | ||
21 | } | 25 | } |
22 | 26 | ||
23 | override fun onResume() { | 27 | override fun onResume() { |
android/app/src/main/kotlin/com/kouyuxingqiu/wow_english/methodChannels/GameMethodChannel.kt
0 → 100644
1 | +package com.kouyuxingqiu.wow_english.methodChannels | ||
2 | + | ||
3 | +import android.content.Intent | ||
4 | +import android.content.Intent.getIntent | ||
5 | +import android.util.Log | ||
6 | +import androidx.core.content.ContextCompat.startActivity | ||
7 | +import com.kouyuxingqiu.wow_english.singsound.SingEngineHelper | ||
8 | +import com.kouyuxingqiu.wow_english.util.GlobalHandler | ||
9 | +import io.flutter.embedding.android.FlutterActivity | ||
10 | +import io.flutter.embedding.engine.FlutterEngine | ||
11 | +import io.flutter.plugin.common.MethodChannel | ||
12 | +import org.cocos2dx.cpp.AppActivity | ||
13 | +import java.lang.ref.WeakReference | ||
14 | + | ||
15 | + | ||
16 | +/** | ||
17 | + * @author: stay | ||
18 | + * @date: 2024/4/22 18:36 | ||
19 | + * @description: 游戏方法通道 | ||
20 | + */ | ||
21 | +class GameMethodChannel(activity: FlutterActivity, flutterEngine: FlutterEngine) { | ||
22 | + private var methodChannel: MethodChannel? = null | ||
23 | + private val TAG = "GameMethodChannel" | ||
24 | + | ||
25 | + companion object { | ||
26 | + var channel: WeakReference<GameMethodChannel>? = null | ||
27 | + | ||
28 | + fun invokeMethod(method: String, arguments: Any?) { | ||
29 | + channel?.get()?.methodChannel?.invokeMethod(method, arguments) | ||
30 | + } | ||
31 | + } | ||
32 | + | ||
33 | + init { | ||
34 | + // name需与flutter端一致 | ||
35 | + methodChannel = | ||
36 | + MethodChannel( | ||
37 | + flutterEngine.dartExecutor.binaryMessenger, | ||
38 | + "wow_english/game_method_channel" | ||
39 | + ) | ||
40 | + methodChannel?.setMethodCallHandler { call, result -> | ||
41 | + Log.d(TAG, "call=${call.method} ${call.arguments} result=$result") | ||
42 | + when (call.method) { | ||
43 | + "openGamePage" -> { | ||
44 | + if (call.hasArgument("gameId")) { | ||
45 | + val gameId = call.argument<Int>("gameId") | ||
46 | + activity.startActivity( | ||
47 | + Intent(activity, AppActivity::class.java).apply { | ||
48 | + putExtra("game", gameId) | ||
49 | + }) | ||
50 | + result.success(true) | ||
51 | + } else { | ||
52 | + result.success(false) | ||
53 | + } | ||
54 | + } | ||
55 | + } | ||
56 | + } | ||
57 | + channel = WeakReference(this) | ||
58 | + } | ||
59 | +} | ||
0 | \ No newline at end of file | 60 | \ No newline at end of file |
android/build.gradle
@@ -17,6 +17,7 @@ allprojects { | @@ -17,6 +17,7 @@ allprojects { | ||
17 | google() | 17 | google() |
18 | mavenCentral() | 18 | mavenCentral() |
19 | maven { url 'https://repo.singsound.com/repository/singsound_ginger_android_sdk/' } | 19 | maven { url 'https://repo.singsound.com/repository/singsound_ginger_android_sdk/' } |
20 | + maven { url 'https://maven.zjzxsl.com/repository/android-public/' } | ||
20 | } | 21 | } |
21 | } | 22 | } |
22 | 23 |
assets/images/apple_pay.png
0 → 100644
1.78 KB
assets/images/bg_frame_module.png
0 → 100644
54.1 KB
assets/images/bg_header_sliver.png
0 → 100644
120 KB
assets/images/btn_pay.png
0 → 100644
45.8 KB
assets/images/checked.png
0 → 100644
3.2 KB
assets/images/ic_countdown.png
0 → 100644
2.1 KB
assets/images/label_module_game.png
0 → 100644
15.7 KB
assets/images/label_module_study.png
0 → 100644
15.9 KB
assets/images/pic_module_game.png
0 → 100644
217 KB
assets/images/pic_module_study.png
0 → 100644
248 KB
assets/images/unchecked.png
0 → 100644
3.12 KB
assets/images/weixin.png
0 → 100644
3.79 KB
assets/images/zhifubao.png
0 → 100644
4.64 KB
ios/Podfile
@@ -33,7 +33,7 @@ target 'Runner' do | @@ -33,7 +33,7 @@ target 'Runner' do | ||
33 | use_frameworks! | 33 | use_frameworks! |
34 | use_modular_headers! | 34 | use_modular_headers! |
35 | pod 'SingSoundSDK' | 35 | pod 'SingSoundSDK' |
36 | - | 36 | + |
37 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) | 37 | flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) |
38 | target 'RunnerTests' do | 38 | target 'RunnerTests' do |
39 | inherit! :search_paths | 39 | inherit! :search_paths |
ios/Runner.xcodeproj/project.pbxproj
@@ -24,10 +24,7 @@ | @@ -24,10 +24,7 @@ | ||
24 | B891A6152BD21EF3006CB06E /* game_food in Resources */ = {isa = PBXBuildFile; fileRef = B891A6112BD21EEF006CB06E /* game_food */; }; | 24 | B891A6152BD21EF3006CB06E /* game_food in Resources */ = {isa = PBXBuildFile; fileRef = B891A6112BD21EEF006CB06E /* game_food */; }; |
25 | B891A6162BD21EF3006CB06E /* game_halloween in Resources */ = {isa = PBXBuildFile; fileRef = B891A6122BD21EF2006CB06E /* game_halloween */; }; | 25 | B891A6162BD21EF3006CB06E /* game_halloween in Resources */ = {isa = PBXBuildFile; fileRef = B891A6122BD21EF2006CB06E /* game_halloween */; }; |
26 | B891A6172BD21EF3006CB06E /* game_animal in Resources */ = {isa = PBXBuildFile; fileRef = B891A6132BD21EF3006CB06E /* game_animal */; }; | 26 | B891A6172BD21EF3006CB06E /* game_animal in Resources */ = {isa = PBXBuildFile; fileRef = B891A6132BD21EF3006CB06E /* game_animal */; }; |
27 | - B891A61A2BD21F2B006CB06E /* CloseNormal.png in Resources */ = {isa = PBXBuildFile; fileRef = B891A6182BD21F2B006CB06E /* CloseNormal.png */; }; | ||
28 | - B891A61B2BD21F2B006CB06E /* CloseSelected.png in Resources */ = {isa = PBXBuildFile; fileRef = B891A6192BD21F2B006CB06E /* CloseSelected.png */; }; | ||
29 | B891A61D2BD21F6B006CB06E /* res in Resources */ = {isa = PBXBuildFile; fileRef = B891A61C2BD21F6B006CB06E /* res */; }; | 27 | B891A61D2BD21F6B006CB06E /* res in Resources */ = {isa = PBXBuildFile; fileRef = B891A61C2BD21F6B006CB06E /* res */; }; |
30 | - B891A61F2BD21FA2006CB06E /* HelloWorld.png in Resources */ = {isa = PBXBuildFile; fileRef = B891A61E2BD21FA2006CB06E /* HelloWorld.png */; }; | ||
31 | B891A7FE2BD24EFA006CB06E /* ActionData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B891A6202BD24EF9006CB06E /* ActionData.cpp */; }; | 28 | B891A7FE2BD24EFA006CB06E /* ActionData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B891A6202BD24EF9006CB06E /* ActionData.cpp */; }; |
32 | B891A7FF2BD24EFA006CB06E /* AlertView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B891A6222BD24EF9006CB06E /* AlertView.cpp */; }; | 29 | B891A7FF2BD24EFA006CB06E /* AlertView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B891A6222BD24EF9006CB06E /* AlertView.cpp */; }; |
33 | B891A8002BD24EFA006CB06E /* AppLinksView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B891A6242BD24EF9006CB06E /* AppLinksView.cpp */; }; | 30 | B891A8002BD24EFA006CB06E /* AppLinksView.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B891A6242BD24EF9006CB06E /* AppLinksView.cpp */; }; |
@@ -476,10 +473,7 @@ | @@ -476,10 +473,7 @@ | ||
476 | B891A6112BD21EEF006CB06E /* game_food */ = {isa = PBXFileReference; lastKnownFileType = folder; path = game_food; sourceTree = "<group>"; }; | 473 | B891A6112BD21EEF006CB06E /* game_food */ = {isa = PBXFileReference; lastKnownFileType = folder; path = game_food; sourceTree = "<group>"; }; |
477 | B891A6122BD21EF2006CB06E /* game_halloween */ = {isa = PBXFileReference; lastKnownFileType = folder; path = game_halloween; sourceTree = "<group>"; }; | 474 | B891A6122BD21EF2006CB06E /* game_halloween */ = {isa = PBXFileReference; lastKnownFileType = folder; path = game_halloween; sourceTree = "<group>"; }; |
478 | B891A6132BD21EF3006CB06E /* game_animal */ = {isa = PBXFileReference; lastKnownFileType = folder; path = game_animal; sourceTree = "<group>"; }; | 475 | B891A6132BD21EF3006CB06E /* game_animal */ = {isa = PBXFileReference; lastKnownFileType = folder; path = game_animal; sourceTree = "<group>"; }; |
479 | - B891A6182BD21F2B006CB06E /* CloseNormal.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CloseNormal.png; sourceTree = "<group>"; }; | ||
480 | - B891A6192BD21F2B006CB06E /* CloseSelected.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CloseSelected.png; sourceTree = "<group>"; }; | ||
481 | B891A61C2BD21F6B006CB06E /* res */ = {isa = PBXFileReference; lastKnownFileType = folder; path = res; sourceTree = "<group>"; }; | 476 | B891A61C2BD21F6B006CB06E /* res */ = {isa = PBXFileReference; lastKnownFileType = folder; path = res; sourceTree = "<group>"; }; |
482 | - B891A61E2BD21FA2006CB06E /* HelloWorld.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = HelloWorld.png; sourceTree = "<group>"; }; | ||
483 | B891A6202BD24EF9006CB06E /* ActionData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ActionData.cpp; sourceTree = "<group>"; }; | 477 | B891A6202BD24EF9006CB06E /* ActionData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ActionData.cpp; sourceTree = "<group>"; }; |
484 | B891A6212BD24EF9006CB06E /* ActionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActionData.h; sourceTree = "<group>"; }; | 478 | B891A6212BD24EF9006CB06E /* ActionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActionData.h; sourceTree = "<group>"; }; |
485 | B891A6222BD24EF9006CB06E /* AlertView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlertView.cpp; sourceTree = "<group>"; }; | 479 | B891A6222BD24EF9006CB06E /* AlertView.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AlertView.cpp; sourceTree = "<group>"; }; |
@@ -1085,9 +1079,6 @@ | @@ -1085,9 +1079,6 @@ | ||
1085 | B891A4112BCD13AB006CB06E /* Resources */ = { | 1079 | B891A4112BCD13AB006CB06E /* Resources */ = { |
1086 | isa = PBXGroup; | 1080 | isa = PBXGroup; |
1087 | children = ( | 1081 | children = ( |
1088 | - B891A61E2BD21FA2006CB06E /* HelloWorld.png */, | ||
1089 | - B891A6182BD21F2B006CB06E /* CloseNormal.png */, | ||
1090 | - B891A6192BD21F2B006CB06E /* CloseSelected.png */, | ||
1091 | B891A61C2BD21F6B006CB06E /* res */, | 1082 | B891A61C2BD21F6B006CB06E /* res */, |
1092 | B891A6132BD21EF3006CB06E /* game_animal */, | 1083 | B891A6132BD21EF3006CB06E /* game_animal */, |
1093 | B891A6112BD21EEF006CB06E /* game_food */, | 1084 | B891A6112BD21EEF006CB06E /* game_food */, |
@@ -1805,15 +1796,12 @@ | @@ -1805,15 +1796,12 @@ | ||
1805 | buildActionMask = 2147483647; | 1796 | buildActionMask = 2147483647; |
1806 | files = ( | 1797 | files = ( |
1807 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, | 1798 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, |
1808 | - B891A61B2BD21F2B006CB06E /* CloseSelected.png in Resources */, | ||
1809 | B891A6152BD21EF3006CB06E /* game_food in Resources */, | 1799 | B891A6152BD21EF3006CB06E /* game_food in Resources */, |
1810 | B891A60F2BD21BBC006CB06E /* fonts in Resources */, | 1800 | B891A60F2BD21BBC006CB06E /* fonts in Resources */, |
1811 | - B891A61F2BD21FA2006CB06E /* HelloWorld.png in Resources */, | ||
1812 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, | 1801 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, |
1813 | B891A6172BD21EF3006CB06E /* game_animal in Resources */, | 1802 | B891A6172BD21EF3006CB06E /* game_animal in Resources */, |
1814 | B891A6142BD21EF3006CB06E /* game_toy in Resources */, | 1803 | B891A6142BD21EF3006CB06E /* game_toy in Resources */, |
1815 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, | 1804 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, |
1816 | - B891A61A2BD21F2B006CB06E /* CloseNormal.png in Resources */, | ||
1817 | B891A61D2BD21F6B006CB06E /* res in Resources */, | 1805 | B891A61D2BD21F6B006CB06E /* res in Resources */, |
1818 | B891A6162BD21EF3006CB06E /* game_halloween in Resources */, | 1806 | B891A6162BD21EF3006CB06E /* game_halloween in Resources */, |
1819 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, | 1807 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, |
@@ -2321,15 +2309,17 @@ | @@ -2321,15 +2309,17 @@ | ||
2321 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | 2309 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
2322 | CLANG_ENABLE_MODULES = YES; | 2310 | CLANG_ENABLE_MODULES = YES; |
2323 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | 2311 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; |
2324 | - CURRENT_PROJECT_VERSION = 2; | ||
2325 | - DEVELOPMENT_TEAM = T8P9KW8GWH; | 2312 | + CODE_SIGN_STYLE = Manual; |
2313 | + CURRENT_PROJECT_VERSION = 3; | ||
2314 | + DEVELOPMENT_TEAM = ""; | ||
2315 | + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = T8P9KW8GWH; | ||
2326 | ENABLE_BITCODE = NO; | 2316 | ENABLE_BITCODE = NO; |
2327 | INFOPLIST_FILE = Runner/Info.plist; | 2317 | INFOPLIST_FILE = Runner/Info.plist; |
2328 | LD_RUNPATH_SEARCH_PATHS = ( | 2318 | LD_RUNPATH_SEARCH_PATHS = ( |
2329 | "$(inherited)", | 2319 | "$(inherited)", |
2330 | "@executable_path/Frameworks", | 2320 | "@executable_path/Frameworks", |
2331 | ); | 2321 | ); |
2332 | - MARKETING_VERSION = 1.0.2; | 2322 | + MARKETING_VERSION = 1.0.3; |
2333 | OTHER_CFLAGS = ( | 2323 | OTHER_CFLAGS = ( |
2334 | "-DNDEBUG", | 2324 | "-DNDEBUG", |
2335 | "'-std=gnu99'", | 2325 | "'-std=gnu99'", |
@@ -2457,6 +2447,8 @@ | @@ -2457,6 +2447,8 @@ | ||
2457 | ); | 2447 | ); |
2458 | PRODUCT_BUNDLE_IDENTIFIER = com.kouyuxingqiu.wowenglish; | 2448 | PRODUCT_BUNDLE_IDENTIFIER = com.kouyuxingqiu.wowenglish; |
2459 | PRODUCT_NAME = "$(TARGET_NAME)"; | 2449 | PRODUCT_NAME = "$(TARGET_NAME)"; |
2450 | + PROVISIONING_PROFILE_SPECIFIER = ""; | ||
2451 | + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "wow english"; | ||
2460 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; | 2452 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; |
2461 | SUPPORTS_MACCATALYST = NO; | 2453 | SUPPORTS_MACCATALYST = NO; |
2462 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; | 2454 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; |
@@ -2664,8 +2656,10 @@ | @@ -2664,8 +2656,10 @@ | ||
2664 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | 2656 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
2665 | CLANG_ENABLE_MODULES = YES; | 2657 | CLANG_ENABLE_MODULES = YES; |
2666 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | 2658 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; |
2667 | - CURRENT_PROJECT_VERSION = 2; | ||
2668 | - DEVELOPMENT_TEAM = T8P9KW8GWH; | 2659 | + CODE_SIGN_STYLE = Manual; |
2660 | + CURRENT_PROJECT_VERSION = 3; | ||
2661 | + DEVELOPMENT_TEAM = ""; | ||
2662 | + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = T8P9KW8GWH; | ||
2669 | ENABLE_BITCODE = NO; | 2663 | ENABLE_BITCODE = NO; |
2670 | HEADER_SEARCH_PATHS = ( | 2664 | HEADER_SEARCH_PATHS = ( |
2671 | "$(inherited)", | 2665 | "$(inherited)", |
@@ -2694,7 +2688,7 @@ | @@ -2694,7 +2688,7 @@ | ||
2694 | "$(inherited)", | 2688 | "$(inherited)", |
2695 | "@executable_path/Frameworks", | 2689 | "@executable_path/Frameworks", |
2696 | ); | 2690 | ); |
2697 | - MARKETING_VERSION = 1.0.2; | 2691 | + MARKETING_VERSION = 1.0.3; |
2698 | ONLY_ACTIVE_ARCH = NO; | 2692 | ONLY_ACTIVE_ARCH = NO; |
2699 | OTHER_CFLAGS = "'-std=gnu99'"; | 2693 | OTHER_CFLAGS = "'-std=gnu99'"; |
2700 | OTHER_CPLUSPLUSFLAGS = "'-std=c++11'"; | 2694 | OTHER_CPLUSPLUSFLAGS = "'-std=c++11'"; |
@@ -2817,6 +2811,8 @@ | @@ -2817,6 +2811,8 @@ | ||
2817 | ); | 2811 | ); |
2818 | PRODUCT_BUNDLE_IDENTIFIER = com.kouyuxingqiu.wowenglish; | 2812 | PRODUCT_BUNDLE_IDENTIFIER = com.kouyuxingqiu.wowenglish; |
2819 | PRODUCT_NAME = "$(TARGET_NAME)"; | 2813 | PRODUCT_NAME = "$(TARGET_NAME)"; |
2814 | + PROVISIONING_PROFILE_SPECIFIER = ""; | ||
2815 | + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "wow english"; | ||
2820 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; | 2816 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; |
2821 | SUPPORTS_MACCATALYST = NO; | 2817 | SUPPORTS_MACCATALYST = NO; |
2822 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; | 2818 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; |
@@ -2868,15 +2864,17 @@ | @@ -2868,15 +2864,17 @@ | ||
2868 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; | 2864 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
2869 | CLANG_ENABLE_MODULES = YES; | 2865 | CLANG_ENABLE_MODULES = YES; |
2870 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; | 2866 | CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; |
2871 | - CURRENT_PROJECT_VERSION = 2; | ||
2872 | - DEVELOPMENT_TEAM = T8P9KW8GWH; | 2867 | + CODE_SIGN_STYLE = Manual; |
2868 | + CURRENT_PROJECT_VERSION = 3; | ||
2869 | + DEVELOPMENT_TEAM = ""; | ||
2870 | + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = T8P9KW8GWH; | ||
2873 | ENABLE_BITCODE = NO; | 2871 | ENABLE_BITCODE = NO; |
2874 | INFOPLIST_FILE = Runner/Info.plist; | 2872 | INFOPLIST_FILE = Runner/Info.plist; |
2875 | LD_RUNPATH_SEARCH_PATHS = ( | 2873 | LD_RUNPATH_SEARCH_PATHS = ( |
2876 | "$(inherited)", | 2874 | "$(inherited)", |
2877 | "@executable_path/Frameworks", | 2875 | "@executable_path/Frameworks", |
2878 | ); | 2876 | ); |
2879 | - MARKETING_VERSION = 1.0.2; | 2877 | + MARKETING_VERSION = 1.0.3; |
2880 | OTHER_CFLAGS = ( | 2878 | OTHER_CFLAGS = ( |
2881 | "-DNDEBUG", | 2879 | "-DNDEBUG", |
2882 | "'-std=gnu99'", | 2880 | "'-std=gnu99'", |
@@ -3004,6 +3002,8 @@ | @@ -3004,6 +3002,8 @@ | ||
3004 | ); | 3002 | ); |
3005 | PRODUCT_BUNDLE_IDENTIFIER = com.kouyuxingqiu.wowenglish; | 3003 | PRODUCT_BUNDLE_IDENTIFIER = com.kouyuxingqiu.wowenglish; |
3006 | PRODUCT_NAME = "$(TARGET_NAME)"; | 3004 | PRODUCT_NAME = "$(TARGET_NAME)"; |
3005 | + PROVISIONING_PROFILE_SPECIFIER = ""; | ||
3006 | + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "wow english"; | ||
3007 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; | 3007 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; |
3008 | SUPPORTS_MACCATALYST = NO; | 3008 | SUPPORTS_MACCATALYST = NO; |
3009 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; | 3009 | SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; |
ios/Runner/AppDelegate.swift
@@ -13,13 +13,6 @@ import Flutter | @@ -13,13 +13,6 @@ import Flutter | ||
13 | _ = XSMessageMehtodChannel(message: controller.binaryMessenger); | 13 | _ = XSMessageMehtodChannel(message: controller.binaryMessenger); |
14 | _ = GameMessageChannel(message: controller.binaryMessenger); | 14 | _ = GameMessageChannel(message: controller.binaryMessenger); |
15 | 15 | ||
16 | -// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 6) { | ||
17 | -// WowGameCocosManager.shared().runGame(); | ||
18 | -// } | ||
19 | -// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 15) { | ||
20 | -// WowGameCocosManager.shared().runGame(); | ||
21 | -// } | ||
22 | - | ||
23 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) | 16 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) |
24 | } | 17 | } |
25 | } | 18 | } |
ios/Runner/GameMessageChannel.swift
@@ -19,11 +19,11 @@ class GameMessageChannel: NSObject { | @@ -19,11 +19,11 @@ class GameMessageChannel: NSObject { | ||
19 | 19 | ||
20 | func handle(_ call: FlutterMethodCall,_ result: @escaping FlutterResult) { | 20 | func handle(_ call: FlutterMethodCall,_ result: @escaping FlutterResult) { |
21 | if (call.method == "openGamePage") { | 21 | if (call.method == "openGamePage") { |
22 | - print("openGamePage") | ||
23 | - WowGameCocosManager.shared().runGame(); | 22 | + print("openGamePage"); |
23 | + let dict = call.arguments as! Dictionary<String, Any> | ||
24 | + let gameid = dict["gameId"] as! Int | ||
25 | + WowGameCocosManager.shared().runGame(gameid); | ||
24 | return | 26 | return |
25 | } | 27 | } |
26 | - | ||
27 | } | 28 | } |
28 | - | ||
29 | } | 29 | } |
ios/Runner/Info.plist
@@ -22,6 +22,19 @@ | @@ -22,6 +22,19 @@ | ||
22 | <string>$(FLUTTER_BUILD_NAME)</string> | 22 | <string>$(FLUTTER_BUILD_NAME)</string> |
23 | <key>CFBundleSignature</key> | 23 | <key>CFBundleSignature</key> |
24 | <string>????</string> | 24 | <string>????</string> |
25 | + <key>CFBundleURLTypes</key> | ||
26 | + <array> | ||
27 | + <dict> | ||
28 | + <key>CFBundleTypeRole</key> | ||
29 | + <string>Editor</string> | ||
30 | + <key>CFBundleURLName</key> | ||
31 | + <string>ishowwoweng</string> | ||
32 | + <key>CFBundleURLSchemes</key> | ||
33 | + <array> | ||
34 | + <string>ishowwoweng</string> | ||
35 | + </array> | ||
36 | + </dict> | ||
37 | + </array> | ||
25 | <key>CFBundleVersion</key> | 38 | <key>CFBundleVersion</key> |
26 | <string>$(FLUTTER_BUILD_NUMBER)</string> | 39 | <string>$(FLUTTER_BUILD_NUMBER)</string> |
27 | <key>LSApplicationCategoryType</key> | 40 | <key>LSApplicationCategoryType</key> |
ios/Runner/Runner.entitlements
@@ -4,5 +4,9 @@ | @@ -4,5 +4,9 @@ | ||
4 | <dict> | 4 | <dict> |
5 | <key>aps-environment</key> | 5 | <key>aps-environment</key> |
6 | <string>development</string> | 6 | <string>development</string> |
7 | + <key>com.apple.developer.associated-domains</key> | ||
8 | + <array> | ||
9 | + <string>applinks:app-api.wowenglish.com.cn</string> | ||
10 | + </array> | ||
7 | </dict> | 11 | </dict> |
8 | </plist> | 12 | </plist> |
ios/Runner/Wowgame/Classes/CocosAppDelegate.cpp
@@ -24,7 +24,15 @@ | @@ -24,7 +24,15 @@ | ||
24 | 24 | ||
25 | #include "CocosAppDelegate.h" | 25 | #include "CocosAppDelegate.h" |
26 | #include "HelloWorldScene.h" | 26 | #include "HelloWorldScene.h" |
27 | -#include "game_food/ScalingUtils.h" | 27 | + |
28 | + | ||
29 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | ||
30 | +#include "NativeAndroid/AndroidUtils_cpp.h" | ||
31 | +#endif | ||
32 | + | ||
33 | + | ||
34 | + | ||
35 | + | ||
28 | // #define USE_AUDIO_ENGINE 1 | 36 | // #define USE_AUDIO_ENGINE 1 |
29 | 37 | ||
30 | #if USE_AUDIO_ENGINE | 38 | #if USE_AUDIO_ENGINE |
@@ -41,11 +49,16 @@ CocosAppDelegate::CocosAppDelegate() | @@ -41,11 +49,16 @@ CocosAppDelegate::CocosAppDelegate() | ||
41 | { | 49 | { |
42 | } | 50 | } |
43 | 51 | ||
44 | -CocosAppDelegate::~CocosAppDelegate() | 52 | +CocosAppDelegate::~CocosAppDelegate() |
45 | { | 53 | { |
46 | #if USE_AUDIO_ENGINE | 54 | #if USE_AUDIO_ENGINE |
47 | AudioEngine::end(); | 55 | AudioEngine::end(); |
48 | #endif | 56 | #endif |
57 | + | ||
58 | + SpriteFrameCache::getInstance()->removeSpriteFrames(); | ||
59 | + Director::getInstance()->getTextureCache()->removeAllTextures(); | ||
60 | + | ||
61 | + | ||
49 | } | 62 | } |
50 | 63 | ||
51 | // if you want a different context, modify the value of glContextAttrs | 64 | // if you want a different context, modify the value of glContextAttrs |
@@ -58,7 +71,7 @@ void CocosAppDelegate::initGLContextAttrs() | @@ -58,7 +71,7 @@ void CocosAppDelegate::initGLContextAttrs() | ||
58 | GLView::setGLContextAttrs(glContextAttrs); | 71 | GLView::setGLContextAttrs(glContextAttrs); |
59 | } | 72 | } |
60 | 73 | ||
61 | -// if you want to use the package manager to install more packages, | 74 | +// if you want to use the package manager to install more packages, |
62 | // don't modify or remove this function | 75 | // don't modify or remove this function |
63 | static int register_all_packages() | 76 | static int register_all_packages() |
64 | { | 77 | { |
ios/Runner/Wowgame/Classes/HelloWorldScene.cpp
@@ -71,69 +71,24 @@ bool HelloWorld::init() | @@ -71,69 +71,24 @@ bool HelloWorld::init() | ||
71 | return false; | 71 | return false; |
72 | } | 72 | } |
73 | 73 | ||
74 | - auto visibleSize = Director::getInstance()->getVisibleSize(); | ||
75 | - Vec2 origin = Director::getInstance()->getVisibleOrigin(); | 74 | + auto m_eventListener = EventListenerCustom::create("start_gameid", [=](EventCustom* event) { |
75 | + char* pData = (char*)event->getUserData(); | ||
76 | + intptr_t gameid = (intptr_t)pData; | ||
77 | + CCLOG("HelloWorld gameid = %d",gameid); | ||
78 | + this->startGameById(gameid); | ||
79 | + }); | ||
80 | + Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(m_eventListener, 1); | ||
76 | 81 | ||
77 | - ///////////////////////////// | ||
78 | - // 2. add a menu item with "X" image, which is clicked to quit the program | ||
79 | - // you may modify it. | ||
80 | - | ||
81 | - // add a "close" icon to exit the progress. it's an autorelease object | ||
82 | - auto closeItem = MenuItemImage::create( "CloseNormal.png","CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); | ||
83 | - | ||
84 | - if (closeItem == nullptr || | ||
85 | - closeItem->getContentSize().width <= 0 || | ||
86 | - closeItem->getContentSize().height <= 0) | ||
87 | - { | ||
88 | - problemLoading("'CloseNormal.png' and 'CloseSelected.png'"); | ||
89 | - } | ||
90 | - else | ||
91 | - { | ||
92 | - float x = origin.x + visibleSize.width - closeItem->getContentSize().width/2; | ||
93 | - float y = origin.y + closeItem->getContentSize().height/2; | ||
94 | - closeItem->setPosition(Vec2(x,y)); | ||
95 | - } | ||
96 | - auto lbl_game1 = Label::createWithTTF("food", "fonts/ComicSansMSBold.ttf", 48); | ||
97 | - auto lbl_game2 = Label::createWithTTF("halloween", "fonts/ComicSansMSBold.ttf", 48); | ||
98 | - auto lbl_game3 = Label::createWithTTF("toygamerepo", "fonts/ComicSansMSBold.ttf", 48); | ||
99 | - auto lbl_game4 = Label::createWithTTF("animal", "fonts/ComicSansMSBold.ttf", 48); | ||
100 | - auto lbl_game5 = Label::createWithTTF("exit ", "fonts/ComicSansMSBold.ttf", 48); | ||
101 | - auto btn_game1 = MenuItemLabel::create(lbl_game1, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); | ||
102 | - auto btn_game2 = MenuItemLabel::create(lbl_game2, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); | ||
103 | - auto btn_game3 = MenuItemLabel::create(lbl_game3, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); | ||
104 | - auto btn_game4 = MenuItemLabel::create(lbl_game4, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); | ||
105 | - auto btn_game5 = MenuItemLabel::create(lbl_game5, CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); | ||
106 | - btn_game1->setPosition(visibleSize.width * 0.5, visibleSize.height * 0.5 + 400); | ||
107 | - btn_game2->setPosition(visibleSize.width * 0.5, visibleSize.height * 0.5 + 200); | ||
108 | - btn_game3->setPosition(visibleSize.width * 0.5, visibleSize.height * 0.5 - 0); | ||
109 | - btn_game4->setPosition(visibleSize.width * 0.5, visibleSize.height * 0.5 - 200); | ||
110 | - btn_game5->setPosition(visibleSize.width * 0.5, visibleSize.height * 0.5 - 400); | ||
111 | - btn_game1->setTag(101); | ||
112 | - btn_game2->setTag(102); | ||
113 | - btn_game3->setTag(103); | ||
114 | - btn_game4->setTag(104); | ||
115 | - btn_game5->setTag(105); | ||
116 | - | ||
117 | - // create menu, it's an autorelease object | ||
118 | - auto menu = Menu::create(closeItem, btn_game1, btn_game2, btn_game3, btn_game4,btn_game5, NULL); | ||
119 | - menu->setPosition(Vec2::ZERO); | ||
120 | - this->addChild(menu, 1); | ||
121 | CCLOG("HelloWorld init"); | 82 | CCLOG("HelloWorld init"); |
122 | - | ||
123 | return true; | 83 | return true; |
124 | } | 84 | } |
125 | 85 | ||
126 | 86 | ||
127 | -void HelloWorld::menuCloseCallback(Ref* pSender) | 87 | +void HelloWorld::startGameById(int gameid) |
128 | { | 88 | { |
129 | - | ||
130 | - | ||
131 | - auto node = (Node*)pSender; | ||
132 | - int tag = node -> getTag(); | ||
133 | - | ||
134 | - if (tag == 101)//food | 89 | + int tag = gameid; |
90 | + if (tag == 1)//food | ||
135 | { | 91 | { |
136 | - | ||
137 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); | 92 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); |
138 | searchPaths.push_back("game_food"); | 93 | searchPaths.push_back("game_food"); |
139 | if(ScalingUtils::isSmallDevice()){ | 94 | if(ScalingUtils::isSmallDevice()){ |
@@ -152,13 +107,10 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | @@ -152,13 +107,10 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | ||
152 | Director::getInstance()->replaceScene(newScene); | 107 | Director::getInstance()->replaceScene(newScene); |
153 | } | 108 | } |
154 | 109 | ||
155 | - if (tag == 102)//halloween | 110 | + if (tag == 2)//halloween |
156 | { | 111 | { |
157 | - | ||
158 | - | ||
159 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); | 112 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); |
160 | std::string deviceSpecificFolderName; | 113 | std::string deviceSpecificFolderName; |
161 | - | ||
162 | deviceSpecificFolderName = HResourcesConfig::RES_FOLDER_NAME_XLARGE;//TODO TEMP | 114 | deviceSpecificFolderName = HResourcesConfig::RES_FOLDER_NAME_XLARGE;//TODO TEMP |
163 | searchPaths.push_back("game_halloween/" + deviceSpecificFolderName); | 115 | searchPaths.push_back("game_halloween/" + deviceSpecificFolderName); |
164 | searchPaths.push_back("game_halloween/common"); | 116 | searchPaths.push_back("game_halloween/common"); |
@@ -168,14 +120,11 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | @@ -168,14 +120,11 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | ||
168 | std::string layoutFilePath = "game_halloween/xlarge/scene_layout.scl"; | 120 | std::string layoutFilePath = "game_halloween/xlarge/scene_layout.scl"; |
169 | HGameConfigParser parser(configFilePath); | 121 | HGameConfigParser parser(configFilePath); |
170 | auto gameScene = dynamic_cast<HSubGameSceneSpaceInvaders*>(parser.createGameScene(layoutFilePath)); | 122 | auto gameScene = dynamic_cast<HSubGameSceneSpaceInvaders*>(parser.createGameScene(layoutFilePath)); |
171 | - // run | ||
172 | Director::getInstance()->replaceScene(gameScene); | 123 | Director::getInstance()->replaceScene(gameScene); |
173 | } | 124 | } |
174 | 125 | ||
175 | - if (tag == 103)//toygamerepo | 126 | + if (tag == 3)//toygamerepo |
176 | { | 127 | { |
177 | - | ||
178 | - | ||
179 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); | 128 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); |
180 | std::string deviceSpecificFolderName; | 129 | std::string deviceSpecificFolderName; |
181 | deviceSpecificFolderName = ToyResourcesConfig::RES_FOLDER_NAME_XLARGE;//TODO TEMP | 130 | deviceSpecificFolderName = ToyResourcesConfig::RES_FOLDER_NAME_XLARGE;//TODO TEMP |
@@ -188,13 +137,10 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | @@ -188,13 +137,10 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | ||
188 | // run | 137 | // run |
189 | auto _mainScene = ToyMainMenuScene::create("graphics/main_menu/scene_layout.scl"); | 138 | auto _mainScene = ToyMainMenuScene::create("graphics/main_menu/scene_layout.scl"); |
190 | Director::getInstance()->replaceScene(_mainScene); | 139 | Director::getInstance()->replaceScene(_mainScene); |
191 | - | ||
192 | } | 140 | } |
193 | 141 | ||
194 | - if (tag == 104)//animal | 142 | + if (tag == 4)//animal |
195 | { | 143 | { |
196 | - | ||
197 | - | ||
198 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); | 144 | auto searchPaths = cocos2d::FileUtils::getInstance()->getSearchPaths(); |
199 | std::string deviceSpecificFolderName; | 145 | std::string deviceSpecificFolderName; |
200 | deviceSpecificFolderName = ToyResourcesConfig::RES_FOLDER_NAME_XLARGE;//TODO TEMP | 146 | deviceSpecificFolderName = ToyResourcesConfig::RES_FOLDER_NAME_XLARGE;//TODO TEMP |
@@ -206,13 +152,8 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | @@ -206,13 +152,8 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | ||
206 | srand(time(0)); | 152 | srand(time(0)); |
207 | auto _mainScene = AniPickLevelScene::create(""); | 153 | auto _mainScene = AniPickLevelScene::create(""); |
208 | Director::getInstance()->replaceScene(_mainScene); | 154 | Director::getInstance()->replaceScene(_mainScene); |
209 | - | ||
210 | } | 155 | } |
211 | 156 | ||
212 | - if (tag == 105)//exit | ||
213 | - { | ||
214 | - Director::getInstance()->end(); | ||
215 | - } | ||
216 | 157 | ||
217 | 158 | ||
218 | 159 | ||
@@ -221,7 +162,7 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | @@ -221,7 +162,7 @@ void HelloWorld::menuCloseCallback(Ref* pSender) | ||
221 | 162 | ||
222 | 163 | ||
223 | 164 | ||
224 | - | 165 | + |
225 | 166 | ||
226 | 167 | ||
227 | 168 |
ios/Runner/Wowgame/Classes/HelloWorldScene.h
@@ -39,7 +39,7 @@ public: | @@ -39,7 +39,7 @@ public: | ||
39 | // virtual void onExit() override; | 39 | // virtual void onExit() override; |
40 | 40 | ||
41 | // a selector callback | 41 | // a selector callback |
42 | - void menuCloseCallback(cocos2d::Ref* pSender); | 42 | + void startGameById(int gameid); |
43 | 43 | ||
44 | // implement the "static create()" method manually | 44 | // implement the "static create()" method manually |
45 | CREATE_FUNC(HelloWorld); | 45 | CREATE_FUNC(HelloWorld); |
ios/Runner/Wowgame/Classes/NativeIOS/RatePromptHandler_ios.h
ios/Runner/Wowgame/Classes/NativeIOS/RatePromptHandler_ios.mm
@@ -11,4 +11,7 @@ void ratePromptHandler_nativePresentPromptIfApplicable(){ | @@ -11,4 +11,7 @@ void ratePromptHandler_nativePresentPromptIfApplicable(){ | ||
11 | } | 11 | } |
12 | } | 12 | } |
13 | 13 | ||
14 | +void handler_nativeExitGame() { | ||
15 | + [[NSNotificationCenter defaultCenter] postNotificationName:@"_kwowgamecocosexitgame" object:nil]; | ||
16 | +} | ||
14 | 17 |
ios/Runner/Wowgame/Classes/game_animal/AniAlertUtils.cpp
@@ -12,6 +12,12 @@ | @@ -12,6 +12,12 @@ | ||
12 | #include "AniAlertView.h" | 12 | #include "AniAlertView.h" |
13 | #include "AniMiscUtils.h" | 13 | #include "AniMiscUtils.h" |
14 | #include "HelloWorldScene.h" | 14 | #include "HelloWorldScene.h" |
15 | + | ||
16 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
17 | +#include "RatePromptHandler_ios.h" | ||
18 | +#endif | ||
19 | +#include "audio/include/AudioEngine.h" | ||
20 | + | ||
15 | static const int AniAlertViewTagDefault = 999; | 21 | static const int AniAlertViewTagDefault = 999; |
16 | static const int AniAlertViewTagCloseConfirm = 998; | 22 | static const int AniAlertViewTagCloseConfirm = 998; |
17 | 23 | ||
@@ -46,15 +52,21 @@ bool AniAlertUtils::closeDialogIfNecessary(int tag){ | @@ -46,15 +52,21 @@ bool AniAlertUtils::closeDialogIfNecessary(int tag){ | ||
46 | return false; | 52 | return false; |
47 | } | 53 | } |
48 | 54 | ||
49 | -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | 55 | +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
50 | 56 | ||
51 | void AniAlertUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallback){ | 57 | void AniAlertUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallback){ |
52 | showTwoButtonDialog(AniAlertViewTagCloseConfirm, "Are you sure you want to quit?", "Yes, bye!", "No, let's play!", [](){ | 58 | showTwoButtonDialog(AniAlertViewTagCloseConfirm, "Are you sure you want to quit?", "Yes, bye!", "No, let's play!", [](){ |
53 | - //cocos2d::Director::getInstance()->end(); | ||
54 | - auto scene = HelloWorld::createScene(); | ||
55 | - cocos2d::Director::getInstance()->replaceScene(scene); | ||
56 | - | ||
57 | - | 59 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
60 | + cocos2d::Director::getInstance()->end(); | ||
61 | +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
62 | + cocos2d::AudioEngine::stopAll(); | ||
63 | + cocos2d::Director::getInstance()->pause(); | ||
64 | + handler_nativeExitGame(); | ||
65 | +#else | ||
66 | + cocos2d::Director::getInstance()->end(); | ||
67 | +#endif | ||
68 | + //auto scene = HelloWorld::createScene(); | ||
69 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
58 | 70 | ||
59 | }, onCancelCallback); | 71 | }, onCancelCallback); |
60 | } | 72 | } |
@@ -63,4 +75,4 @@ bool AniAlertUtils::closeAppCloseConfirmDialogIfNecessary(){ | @@ -63,4 +75,4 @@ bool AniAlertUtils::closeAppCloseConfirmDialogIfNecessary(){ | ||
63 | return closeDialogIfNecessary(AniAlertViewTagCloseConfirm); | 75 | return closeDialogIfNecessary(AniAlertViewTagCloseConfirm); |
64 | } | 76 | } |
65 | 77 | ||
66 | -#endif | 78 | +//#endif |
ios/Runner/Wowgame/Classes/game_animal/AniAlertUtils.h
@@ -19,10 +19,10 @@ public: | @@ -19,10 +19,10 @@ public: | ||
19 | static void showTwoButtonDialog(int tag, std::string text, std::string okButtonText, std::string cancelButtonText, std::function<void()> onOKCallback, std::function<void()> onCancelCallback = [](){}); | 19 | static void showTwoButtonDialog(int tag, std::string text, std::string okButtonText, std::string cancelButtonText, std::function<void()> onOKCallback, std::function<void()> onCancelCallback = [](){}); |
20 | static bool closeDialogIfNecessary(int tag); | 20 | static bool closeDialogIfNecessary(int tag); |
21 | 21 | ||
22 | -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | 22 | +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
23 | static void showAppCloseConfirmDialog(std::function<void()> onCancelCallback); | 23 | static void showAppCloseConfirmDialog(std::function<void()> onCancelCallback); |
24 | static bool closeAppCloseConfirmDialogIfNecessary(); | 24 | static bool closeAppCloseConfirmDialogIfNecessary(); |
25 | -#endif | 25 | +//#endif |
26 | }; | 26 | }; |
27 | 27 | ||
28 | #endif /* AniAlertUtils_h */ | 28 | #endif /* AniAlertUtils_h */ |
ios/Runner/Wowgame/Classes/game_animal/AniParentScene.cpp
@@ -186,7 +186,7 @@ bool AniParentScene::touchHandlerForWidget(std::string objectName, cocos2d::ui:: | @@ -186,7 +186,7 @@ bool AniParentScene::touchHandlerForWidget(std::string objectName, cocos2d::ui:: | ||
186 | // _AniScenarioHandler->pauseScenario(); | 186 | // _AniScenarioHandler->pauseScenario(); |
187 | // _AniScenarioHandler->stopAllActions(); | 187 | // _AniScenarioHandler->stopAllActions(); |
188 | AniSoundsRepo::stopAllSounds(); | 188 | AniSoundsRepo::stopAllSounds(); |
189 | - cocos2d::Director::getInstance()->popScene(); | 189 | + cocos2d::Director::getInstance()->end(); |
190 | _sceneDismissCallback(); | 190 | _sceneDismissCallback(); |
191 | return true; | 191 | return true; |
192 | } /*else if(objectName == "backgroundMusicButton" && touchEventType == cocos2d::ui::Widget::TouchEventType::ENDED){ | 192 | } /*else if(objectName == "backgroundMusicButton" && touchEventType == cocos2d::ui::Widget::TouchEventType::ENDED){ |
@@ -497,9 +497,9 @@ void AniParentScene::showTOSAcceptPopup(std::function<void()> onAccept){ | @@ -497,9 +497,9 @@ void AniParentScene::showTOSAcceptPopup(std::function<void()> onAccept){ | ||
497 | if (n->isShowingParentalGate()) { | 497 | if (n->isShowingParentalGate()) { |
498 | n->hideParentalGate(); | 498 | n->hideParentalGate(); |
499 | } else { | 499 | } else { |
500 | - //cocos2d::Director::getInstance()->end(); | ||
501 | - auto scene = HelloWorld::createScene(); | ||
502 | - cocos2d::Director::getInstance()->replaceScene(scene); | 500 | + cocos2d::Director::getInstance()->end(); |
501 | + //auto scene = HelloWorld::createScene(); | ||
502 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
503 | } | 503 | } |
504 | } | 504 | } |
505 | } | 505 | } |
@@ -524,9 +524,9 @@ void AniParentScene::showAniLevelPickerLayer(std::function<void()> onLayerDismis | @@ -524,9 +524,9 @@ void AniParentScene::showAniLevelPickerLayer(std::function<void()> onLayerDismis | ||
524 | [&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event *event, cocos2d::Node *n) { | 524 | [&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event *event, cocos2d::Node *n) { |
525 | if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK) { | 525 | if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK) { |
526 | if (AniMiscUtils::isNodeVisible(n)) { | 526 | if (AniMiscUtils::isNodeVisible(n)) { |
527 | - //cocos2d::Director::getInstance()->end(); | ||
528 | - auto scene = HelloWorld::createScene(); | ||
529 | - cocos2d::Director::getInstance()->replaceScene(scene); | 527 | + cocos2d::Director::getInstance()->end(); |
528 | + // auto scene = HelloWorld::createScene(); | ||
529 | + // cocos2d::Director::getInstance()->replaceScene(scene); | ||
530 | } | 530 | } |
531 | } | 531 | } |
532 | }, std::placeholders::_1, std::placeholders::_2, AniLevelPickerLayer); | 532 | }, std::placeholders::_1, std::placeholders::_2, AniLevelPickerLayer); |
ios/Runner/Wowgame/Classes/game_animal/AniSettingsLayer.cpp
@@ -12,6 +12,7 @@ | @@ -12,6 +12,7 @@ | ||
12 | #include "AniStrings.h" | 12 | #include "AniStrings.h" |
13 | #include "AniSimpleButton.h" | 13 | #include "AniSimpleButton.h" |
14 | #include "AniKKGLinearLayout.h" | 14 | #include "AniKKGLinearLayout.h" |
15 | +#include "AniAlertUtils.h" | ||
15 | 16 | ||
16 | AniSettingsLayer* AniSettingsLayer::create(float width, float height, std::function<void(int)> onLevelPickedCallback, std::function<void()> onTutorialResetPickedCallback){ | 17 | AniSettingsLayer* AniSettingsLayer::create(float width, float height, std::function<void(int)> onLevelPickedCallback, std::function<void()> onTutorialResetPickedCallback){ |
17 | AniSettingsLayer * view = new (std::nothrow) AniSettingsLayer(); | 18 | AniSettingsLayer * view = new (std::nothrow) AniSettingsLayer(); |
@@ -58,6 +59,7 @@ bool AniSettingsLayer::init(float width, float height, std::function<void(int)> | @@ -58,6 +59,7 @@ bool AniSettingsLayer::init(float width, float height, std::function<void(int)> | ||
58 | 59 | ||
59 | auto webLinkButton = AniSimpleButton::create(); | 60 | auto webLinkButton = AniSimpleButton::create(); |
60 | container->addView(webLinkButton); | 61 | container->addView(webLinkButton); |
62 | + webLinkButton->setVisible(false); | ||
61 | auto buttonTexturePath = "settings_buttons/steve_maggie.png"; | 63 | auto buttonTexturePath = "settings_buttons/steve_maggie.png"; |
62 | webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); | 64 | webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); |
63 | webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | 65 | webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ |
@@ -69,16 +71,38 @@ bool AniSettingsLayer::init(float width, float height, std::function<void(int)> | @@ -69,16 +71,38 @@ bool AniSettingsLayer::init(float width, float height, std::function<void(int)> | ||
69 | }); | 71 | }); |
70 | }); | 72 | }); |
71 | 73 | ||
74 | + | ||
75 | + | ||
72 | auto replayTutorialButton = AniSimpleButton::create(); | 76 | auto replayTutorialButton = AniSimpleButton::create(); |
73 | addChild(replayTutorialButton); | 77 | addChild(replayTutorialButton); |
74 | auto repTutButtonTexturePath = "settings_buttons/play_preview_again.png"; | 78 | auto repTutButtonTexturePath = "settings_buttons/play_preview_again.png"; |
75 | replayTutorialButton->loadTextures(repTutButtonTexturePath, repTutButtonTexturePath, repTutButtonTexturePath); | 79 | replayTutorialButton->loadTextures(repTutButtonTexturePath, repTutButtonTexturePath, repTutButtonTexturePath); |
76 | replayTutorialButton->setScale(1.5f); | 80 | replayTutorialButton->setScale(1.5f); |
77 | replayTutorialButton->setOriginalScale(1.5f); | 81 | replayTutorialButton->setOriginalScale(1.5f); |
78 | - replayTutorialButton->setPosition(cocos2d::Point(getContentSize().width-paddingTop-replayTutorialButton->getContentSize().width/2*1.5, getContentSize().height - paddingTop - replayTutorialButton->getContentSize().height*1.5/2)); | 82 | + auto pos_x = getContentSize().width-paddingTop-replayTutorialButton->getContentSize().width/2*1.5; |
83 | + auto pos_y = getContentSize().height - paddingTop - replayTutorialButton->getContentSize().height*1.5/2; | ||
84 | + | ||
85 | + replayTutorialButton->setPosition(cocos2d::Point(pos_x - 400 ,pos_y)); | ||
79 | replayTutorialButton->setOnTouchEndedCallback([&, replayTutorialButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | 86 | replayTutorialButton->setOnTouchEndedCallback([&, replayTutorialButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ |
80 | _onTutorialReset(); | 87 | _onTutorialReset(); |
81 | }); | 88 | }); |
89 | + | ||
90 | + | ||
91 | + auto appExitButton = AniSimpleButton::create(); | ||
92 | + addChild(appExitButton); | ||
93 | + auto exitButtonTexturePath = "buttons/graphics/button_x.png"; | ||
94 | + appExitButton->loadTextures(exitButtonTexturePath, exitButtonTexturePath, exitButtonTexturePath); | ||
95 | + appExitButton->setScale(1.5f); | ||
96 | + appExitButton->setOriginalScale(1.5f); | ||
97 | + appExitButton->setPosition(cocos2d::Point(getContentSize().width-paddingTop-appExitButton->getContentSize().width/2*1.5, pos_y)); | ||
98 | + appExitButton->setOnTouchEndedCallback([&, appExitButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | ||
99 | + AniAlertUtils::showAppCloseConfirmDialog([&](){ | ||
100 | + }); | ||
101 | + }); | ||
102 | + | ||
103 | + | ||
104 | + | ||
105 | + | ||
82 | 106 | ||
83 | auto menuPadding = 30*AniScalingUtils::scaleAspectFillToDesignIpadProSize();//TODO magic number | 107 | auto menuPadding = 30*AniScalingUtils::scaleAspectFillToDesignIpadProSize();//TODO magic number |
84 | 108 |
ios/Runner/Wowgame/Classes/game_food/MiscUtils.cpp
@@ -11,6 +11,12 @@ | @@ -11,6 +11,12 @@ | ||
11 | #include "GeometryUtils.h" | 11 | #include "GeometryUtils.h" |
12 | #include "AlertView.h" | 12 | #include "AlertView.h" |
13 | #include "HelloWorldScene.h" | 13 | #include "HelloWorldScene.h" |
14 | + | ||
15 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
16 | +#include "RatePromptHandler_ios.h" | ||
17 | +#endif | ||
18 | +#include "audio/include/AudioEngine.h" | ||
19 | + | ||
14 | float MiscUtils::StandardAnimationTime = 0.2; | 20 | float MiscUtils::StandardAnimationTime = 0.2; |
15 | const std::string MiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY"; | 21 | const std::string MiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY"; |
16 | const std::string MiscUtils::TOS_ACCEPTED_UD_KEY = "TOS_ACCEPTED_UD_KEY"; | 22 | const std::string MiscUtils::TOS_ACCEPTED_UD_KEY = "TOS_ACCEPTED_UD_KEY"; |
@@ -180,7 +186,7 @@ std::string MiscUtils::clockMinSecTimeString(int seconds){ | @@ -180,7 +186,7 @@ std::string MiscUtils::clockMinSecTimeString(int seconds){ | ||
180 | return timeString; | 186 | return timeString; |
181 | } | 187 | } |
182 | 188 | ||
183 | -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | 189 | +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
184 | 190 | ||
185 | static const int AlertViewTag = 999; | 191 | static const int AlertViewTag = 999; |
186 | 192 | ||
@@ -198,10 +204,18 @@ void MiscUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallback | @@ -198,10 +204,18 @@ void MiscUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallback | ||
198 | auto okColor = cocos2d::Color3B(200, 100, 100); | 204 | auto okColor = cocos2d::Color3B(200, 100, 100); |
199 | 205 | ||
200 | auto alert = AlertView::create(message, okText, cancelText, okColor, cancelColor, []() { | 206 | auto alert = AlertView::create(message, okText, cancelText, okColor, cancelColor, []() { |
201 | - // cocos2d::Director::getInstance()->end(); | ||
202 | - auto scene = HelloWorld::createScene(); | ||
203 | - cocos2d::Director::getInstance()->replaceScene(scene); | ||
204 | 207 | ||
208 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | ||
209 | + cocos2d::Director::getInstance()->end(); | ||
210 | +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
211 | + cocos2d::AudioEngine::stopAll(); | ||
212 | + cocos2d::Director::getInstance()->pause(); | ||
213 | + handler_nativeExitGame(); | ||
214 | +#else | ||
215 | + cocos2d::Director::getInstance()->end(); | ||
216 | +#endif | ||
217 | + // auto scene = HelloWorld::createScene(); | ||
218 | + // cocos2d::Director::getInstance()->replaceScene(scene); | ||
205 | 219 | ||
206 | 220 | ||
207 | }, onCancelCallback); | 221 | }, onCancelCallback); |
@@ -231,4 +245,4 @@ bool MiscUtils::closeAppCloseConfirmDialogIfNecessary(){ | @@ -231,4 +245,4 @@ bool MiscUtils::closeAppCloseConfirmDialogIfNecessary(){ | ||
231 | return false; | 245 | return false; |
232 | } | 246 | } |
233 | 247 | ||
234 | -#endif | 248 | +//#endif |
ios/Runner/Wowgame/Classes/game_food/MiscUtils.h
@@ -67,10 +67,10 @@ static void changeAnchorPoint(cocos2d::Node* p_node, cocos2d::Point p_newAnchorP | @@ -67,10 +67,10 @@ static void changeAnchorPoint(cocos2d::Node* p_node, cocos2d::Point p_newAnchorP | ||
67 | 67 | ||
68 | static std::string boolToString(bool value); | 68 | static std::string boolToString(bool value); |
69 | 69 | ||
70 | -#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | 70 | +//#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
71 | static void showAppCloseConfirmDialog(std::function<void()> onCancelCallback); | 71 | static void showAppCloseConfirmDialog(std::function<void()> onCancelCallback); |
72 | static bool closeAppCloseConfirmDialogIfNecessary(); | 72 | static bool closeAppCloseConfirmDialogIfNecessary(); |
73 | -#endif | 73 | +//#endif |
74 | }; | 74 | }; |
75 | 75 | ||
76 | #endif /* MiscUtils_h */ | 76 | #endif /* MiscUtils_h */ |
ios/Runner/Wowgame/Classes/game_food/ParentScene.cpp
@@ -497,9 +497,9 @@ void ParentScene::showTOSAcceptPopup(std::function<void()> onAccept){ | @@ -497,9 +497,9 @@ void ParentScene::showTOSAcceptPopup(std::function<void()> onAccept){ | ||
497 | if (n->isShowingParentalGate()) { | 497 | if (n->isShowingParentalGate()) { |
498 | n->hideParentalGate(); | 498 | n->hideParentalGate(); |
499 | } else { | 499 | } else { |
500 | - // cocos2d::Director::getInstance()->end(); | ||
501 | - auto scene = HelloWorld::createScene(); | ||
502 | - cocos2d::Director::getInstance()->replaceScene(scene); | 500 | + cocos2d::Director::getInstance()->end(); |
501 | + // auto scene = HelloWorld::createScene(); | ||
502 | + // cocos2d::Director::getInstance()->replaceScene(scene); | ||
503 | } | 503 | } |
504 | } | 504 | } |
505 | } | 505 | } |
@@ -524,9 +524,9 @@ void ParentScene::showLevelPickerLayer(std::function<void()> onLayerDismissed, s | @@ -524,9 +524,9 @@ void ParentScene::showLevelPickerLayer(std::function<void()> onLayerDismissed, s | ||
524 | [&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event *event, cocos2d::Node *n) { | 524 | [&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event *event, cocos2d::Node *n) { |
525 | if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK) { | 525 | if (keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK) { |
526 | if (MiscUtils::isNodeVisible(n)) { | 526 | if (MiscUtils::isNodeVisible(n)) { |
527 | - //cocos2d::Director::getInstance()->end(); | ||
528 | - auto scene = HelloWorld::createScene(); | ||
529 | - cocos2d::Director::getInstance()->replaceScene(scene); | 527 | + cocos2d::Director::getInstance()->end(); |
528 | + //auto scene = HelloWorld::createScene(); | ||
529 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
530 | } | 530 | } |
531 | } | 531 | } |
532 | }, std::placeholders::_1, std::placeholders::_2, levelPickerLayer); | 532 | }, std::placeholders::_1, std::placeholders::_2, levelPickerLayer); |
ios/Runner/Wowgame/Classes/game_food/SettingsLayer.cpp
@@ -73,31 +73,54 @@ bool SettingsLayer::init(float width, float height, std::function<void(int)> onL | @@ -73,31 +73,54 @@ bool SettingsLayer::init(float width, float height, std::function<void(int)> onL | ||
73 | #endif | 73 | #endif |
74 | 74 | ||
75 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | 75 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) |
76 | - setupAppLinksView(cocos2d::Point(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingBottom - paddingTop)); | ||
77 | - wholeContainer->addChild(m_appLinksView); //TODO messy messy | ||
78 | - auto leftAppLinkSprite = cocos2d::Sprite::create("app_links/witch_halloween_app.png"); | ||
79 | - leftAppLinkSprite->setAnchorPoint(cocos2d::Vec2(1,1)); | ||
80 | - leftAppLinkSprite->setPosition(cocos2d::Vec2(m_appLinksView->getBoundingBox().getMinX(), m_appLinksView->getBoundingBox().getMaxY())); | ||
81 | - auto rightAppLinkSprite = cocos2d::Sprite::create("app_links/doll_toy_app.png"); | ||
82 | - rightAppLinkSprite->setAnchorPoint(cocos2d::Vec2(0,0)); | ||
83 | - rightAppLinkSprite->setPosition(cocos2d::Vec2(m_appLinksView->getBoundingBox().getMaxX(), m_appLinksView->getBoundingBox().getMinY())); | ||
84 | - wholeContainer->addChild(leftAppLinkSprite); | ||
85 | - wholeContainer->addChild(rightAppLinkSprite); | 76 | + // setupAppLinksView(cocos2d::Point(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingBottom - paddingTop)); |
77 | + // wholeContainer->addChild(m_appLinksView); //TODO messy messy | ||
78 | + // auto leftAppLinkSprite = cocos2d::Sprite::create("app_links/witch_halloween_app.png"); | ||
79 | + // leftAppLinkSprite->setAnchorPoint(cocos2d::Vec2(1,1)); | ||
80 | + // leftAppLinkSprite->setPosition(cocos2d::Vec2(m_appLinksView->getBoundingBox().getMinX(), m_appLinksView->getBoundingBox().getMaxY())); | ||
81 | + // auto rightAppLinkSprite = cocos2d::Sprite::create("app_links/doll_toy_app.png"); | ||
82 | + // rightAppLinkSprite->setAnchorPoint(cocos2d::Vec2(0,0)); | ||
83 | + // rightAppLinkSprite->setPosition(cocos2d::Vec2(m_appLinksView->getBoundingBox().getMaxX(), m_appLinksView->getBoundingBox().getMinY())); | ||
84 | + // wholeContainer->addChild(leftAppLinkSprite); | ||
85 | + // wholeContainer->addChild(rightAppLinkSprite); | ||
86 | #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | 86 | #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
87 | - auto webLinkButton = SimpleButton::create(); | ||
88 | - wholeContainer->addChild(webLinkButton); | ||
89 | - auto buttonTexturePath = "app_links/steve_maggie.png"; | ||
90 | - webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); | ||
91 | - webLinkButton->setPosition(cocos2d::Point(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingTop*3 - webLinkButton->getBoundingBox().size.height/2)); | ||
92 | - webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | ||
93 | - presentParentalGate([&](){ | ||
94 | - hideParentalGate(); | ||
95 | - cocos2d::Application::getInstance()->openURL("https://www.steveandmaggie.com"); //TODO hardcoded | ||
96 | - }, [&](){ | ||
97 | - hideParentalGate(); | 87 | + // auto webLinkButton = SimpleButton::create(); |
88 | + // wholeContainer->addChild(webLinkButton); | ||
89 | + // auto buttonTexturePath = "app_links/steve_maggie.png"; | ||
90 | + // webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); | ||
91 | + // webLinkButton->setPosition(cocos2d::Point(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingTop*3 - webLinkButton->getBoundingBox().size.height/2)); | ||
92 | + // webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | ||
93 | + // presentParentalGate([&](){ | ||
94 | + // hideParentalGate(); | ||
95 | + // cocos2d::Application::getInstance()->openURL("https://www.steveandmaggie.com"); //TODO hardcoded | ||
96 | + // }, [&](){ | ||
97 | + // hideParentalGate(); | ||
98 | + // }); | ||
99 | + // }); | ||
100 | +#endif | ||
101 | + auto paddingExitButton = 20*ScalingUtils::scaleAspectFillToDesignIpadProSize(); | ||
102 | + auto scaleExitButton = 1.0f; | ||
103 | + if(ScalingUtils::isSmallDevice()){ | ||
104 | + paddingExitButton *= ScalingUtils::getScaleForSmallDevice(); | ||
105 | + scaleExitButton = 1.6f; | ||
106 | + } | ||
107 | + | ||
108 | + auto appExitButton = SimpleButton::create(); | ||
109 | + addChild(appExitButton); | ||
110 | + auto exitButtonTexturePath = "buttons/graphics/button_x.png"; | ||
111 | + appExitButton->loadTextures(exitButtonTexturePath, exitButtonTexturePath, exitButtonTexturePath); | ||
112 | + appExitButton->setScale(scaleExitButton); | ||
113 | + appExitButton->setOriginalScale(scaleExitButton); | ||
114 | + appExitButton->setPosition(cocos2d::Point(getContentSize().width - appExitButton->getBoundingBox().size.width/2 - paddingExitButton, getContentSize().height - appExitButton->getBoundingBox().size.height/2 - paddingExitButton)); | ||
115 | + appExitButton->setOnTouchEndedCallback([&, appExitButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | ||
116 | + MiscUtils::showAppCloseConfirmDialog([&](){ | ||
98 | }); | 117 | }); |
99 | }); | 118 | }); |
100 | -#endif | 119 | + |
120 | + | ||
121 | + | ||
122 | + | ||
123 | + | ||
101 | 124 | ||
102 | auto menuPadding = 30*ScalingUtils::scaleAspectFillToDesignIpadProSize();//TODO magic number | 125 | auto menuPadding = 30*ScalingUtils::scaleAspectFillToDesignIpadProSize();//TODO magic number |
103 | 126 | ||
@@ -114,9 +137,9 @@ bool SettingsLayer::init(float width, float height, std::function<void(int)> onL | @@ -114,9 +137,9 @@ bool SettingsLayer::init(float width, float height, std::function<void(int)> onL | ||
114 | lowerStuffContainer->setAnchorPoint(cocos2d::Vec2(0.5, 1)); | 137 | lowerStuffContainer->setAnchorPoint(cocos2d::Vec2(0.5, 1)); |
115 | 138 | ||
116 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | 139 | #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) |
117 | - lowerStuffContainer->setPosition(getContentSize().width/2, m_appLinksView->getBoundingBox().getMinY() - paddingBottom); | 140 | + lowerStuffContainer->setPosition(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingBottom); |
118 | #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) | 141 | #elif (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
119 | - lowerStuffContainer->setPosition(getContentSize().width/2, webLinkButton->getBoundingBox().getMinY() - paddingBottom); | 142 | + lowerStuffContainer->setPosition(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingBottom); |
120 | #endif | 143 | #endif |
121 | 144 | ||
122 | menuCenter->setPosition(lowerStuffContainer->getContentSize().width/2, lowerStuffContainer->getContentSize().height/2); | 145 | menuCenter->setPosition(lowerStuffContainer->getContentSize().width/2, lowerStuffContainer->getContentSize().height/2); |
ios/Runner/Wowgame/Classes/game_food/SubGameScene.cpp
@@ -196,7 +196,7 @@ void SubGameScene::presentGameResumeLayer(){ | @@ -196,7 +196,7 @@ void SubGameScene::presentGameResumeLayer(){ | ||
196 | buttonResume->addChild(buttonBg); | 196 | buttonResume->addChild(buttonBg); |
197 | buttonBg->setPosition(cocos2d::Vec2(buttonResume->getContentSize().width/2,buttonResume->getContentSize().height/2)); | 197 | buttonBg->setPosition(cocos2d::Vec2(buttonResume->getContentSize().width/2,buttonResume->getContentSize().height/2)); |
198 | resumeLayer->addChild(buttonResume); | 198 | resumeLayer->addChild(buttonResume); |
199 | - buttonResume->setPosition(cocos2d::Vec2(resumeLayer->getContentSize().width/2 -150 , resumeLayer->getContentSize().height/2)); | 199 | + buttonResume->setPosition(cocos2d::Vec2(resumeLayer->getContentSize().width/2, resumeLayer->getContentSize().height/2)); |
200 | buttonResume->setOnTouchEndedCallback(std::bind([&](std::string name, cocos2d::ui::Widget::TouchEventType eventType, cocos2d::Node* n){ | 200 | buttonResume->setOnTouchEndedCallback(std::bind([&](std::string name, cocos2d::ui::Widget::TouchEventType eventType, cocos2d::Node* n){ |
201 | resumeGame(); | 201 | resumeGame(); |
202 | MiscUtils::hideAndRemoveView(n, true); | 202 | MiscUtils::hideAndRemoveView(n, true); |
@@ -204,29 +204,6 @@ void SubGameScene::presentGameResumeLayer(){ | @@ -204,29 +204,6 @@ void SubGameScene::presentGameResumeLayer(){ | ||
204 | 204 | ||
205 | 205 | ||
206 | 206 | ||
207 | - // add the close button | ||
208 | - auto buttonClose = SimpleButton::create(); | ||
209 | - buttonClose->setCascadeOpacityEnabled(true); | ||
210 | - auto buttonTexturePath2 = "buttons/graphics/button_x.png"; | ||
211 | - buttonClose->loadTextures(buttonTexturePath2, buttonTexturePath2, buttonTexturePath2); | ||
212 | - | ||
213 | - resumeLayer->addChild(buttonClose); | ||
214 | - buttonClose->setPosition(cocos2d::Vec2(resumeLayer->getContentSize().width / 2 + 150, resumeLayer->getContentSize().height / 2)); | ||
215 | - buttonClose->setOnTouchEndedCallback(std::bind([&](std::string name, cocos2d::ui::Widget::TouchEventType eventType, cocos2d::Node* n) { | ||
216 | - | ||
217 | - auto scene = HelloWorld::createScene(); | ||
218 | - // run | ||
219 | - cocos2d::Director::getInstance()->replaceScene(scene); | ||
220 | - | ||
221 | - | ||
222 | - }, std::placeholders::_1, std::placeholders::_2, resumeLayer)); | ||
223 | - | ||
224 | - | ||
225 | - | ||
226 | - | ||
227 | - | ||
228 | - | ||
229 | - | ||
230 | 207 | ||
231 | resumeLayer->setOpacity(0); | 208 | resumeLayer->setOpacity(0); |
232 | MiscUtils::showView(resumeLayer, true, 220.f); | 209 | MiscUtils::showView(resumeLayer, true, 220.f); |
ios/Runner/Wowgame/Classes/game_halloween/HMiscUtils.cpp
@@ -14,6 +14,11 @@ | @@ -14,6 +14,11 @@ | ||
14 | #include "HSoundUtils.h" | 14 | #include "HSoundUtils.h" |
15 | #include "HelloWorldScene.h" | 15 | #include "HelloWorldScene.h" |
16 | 16 | ||
17 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
18 | +#include "RatePromptHandler_ios.h" | ||
19 | +#endif | ||
20 | +#include "audio/include/AudioEngine.h" | ||
21 | + | ||
17 | float HMiscUtils::StandardAnimationTime = 0.2; | 22 | float HMiscUtils::StandardAnimationTime = 0.2; |
18 | const std::string HMiscUtils::MAGGIE_TOUCHED_UD_KEY = "MAGGIE_TOUCHED_UD_KEY"; | 23 | const std::string HMiscUtils::MAGGIE_TOUCHED_UD_KEY = "MAGGIE_TOUCHED_UD_KEY"; |
19 | const std::string HMiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY"; | 24 | const std::string HMiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY"; |
@@ -184,12 +189,20 @@ void HMiscUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallbac | @@ -184,12 +189,20 @@ void HMiscUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallbac | ||
184 | // HSoundUtils::stopAllSounds(); //todo dedup in other places? | 189 | // HSoundUtils::stopAllSounds(); //todo dedup in other places? |
185 | // cocoss2d::AudioEngine::end(); | 190 | // cocoss2d::AudioEngine::end(); |
186 | 191 | ||
187 | - | ||
188 | - //cocos2d::Director::getInstance()->end(); | 192 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
193 | + cocos2d::Director::getInstance()->end(); | ||
194 | +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
195 | + cocos2d::AudioEngine::stopAll(); | ||
196 | + cocos2d::Director::getInstance()->pause(); | ||
197 | + handler_nativeExitGame(); | ||
198 | +#else | ||
199 | + cocos2d::Director::getInstance()->end(); | ||
200 | +#endif | ||
201 | + | ||
189 | // create a scene. it's an autorelease object | 202 | // create a scene. it's an autorelease object |
190 | - auto scene = HelloWorld::createScene(); | 203 | + //auto scene = HelloWorld::createScene(); |
191 | // run | 204 | // run |
192 | - cocos2d::Director::getInstance()->replaceScene(scene); | 205 | + //cocos2d::Director::getInstance()->replaceScene(scene); |
193 | 206 | ||
194 | 207 | ||
195 | 208 |
ios/Runner/Wowgame/Classes/game_halloween/HSettingsLayer.cpp
@@ -63,15 +63,16 @@ bool HSettingsLayer::init(float width, float height, std::function<void(int)> on | @@ -63,15 +63,16 @@ bool HSettingsLayer::init(float width, float height, std::function<void(int)> on | ||
63 | 63 | ||
64 | auto webLinkButton = HalloweenSimpleButton::create(); | 64 | auto webLinkButton = HalloweenSimpleButton::create(); |
65 | wholeContainer->addView(webLinkButton); | 65 | wholeContainer->addView(webLinkButton); |
66 | + webLinkButton->setVisible(false); | ||
66 | auto buttonTexturePath = "settings_buttons/steve_maggie.png"; | 67 | auto buttonTexturePath = "settings_buttons/steve_maggie.png"; |
67 | webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); | 68 | webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); |
68 | webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | 69 | webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ |
69 | - presentParentalGate([&](){ | ||
70 | - hideParentalGate(); | ||
71 | - cocos2d::Application::getInstance()->openURL("https://www.steveandmaggie.com"); //TODO hardcoded | ||
72 | - }, [&](){ | ||
73 | - hideParentalGate(); | ||
74 | - }); | 70 | + // presentParentalGate([&](){ |
71 | + // hideParentalGate(); | ||
72 | + // cocos2d::Application::getInstance()->openURL("https://www.steveandmaggie.com"); //TODO hardcoded | ||
73 | + // }, [&](){ | ||
74 | + // hideParentalGate(); | ||
75 | + // }); | ||
75 | }); | 76 | }); |
76 | 77 | ||
77 | auto lowerStuffContainer = cocos2d::Node::create(); | 78 | auto lowerStuffContainer = cocos2d::Node::create(); |
ios/Runner/Wowgame/Classes/game_halloween/HSubGameScene.cpp
@@ -568,10 +568,10 @@ void HSubGameScene::showTOSAcceptPopup(std::function<void()> onAccept){ | @@ -568,10 +568,10 @@ void HSubGameScene::showTOSAcceptPopup(std::function<void()> onAccept){ | ||
568 | } else { | 568 | } else { |
569 | // HSoundUtils::stopAllSounds(); | 569 | // HSoundUtils::stopAllSounds(); |
570 | // cocos2d::AudioEngine::end(); | 570 | // cocos2d::AudioEngine::end(); |
571 | - //cocos2d::Director::getInstance()->end(); | 571 | + cocos2d::Director::getInstance()->end(); |
572 | 572 | ||
573 | - auto scene = HelloWorld::createScene(); | ||
574 | - cocos2d::Director::getInstance()->replaceScene(scene); | 573 | + //auto scene = HelloWorld::createScene(); |
574 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
575 | } | 575 | } |
576 | } | 576 | } |
577 | } | 577 | } |
@@ -593,10 +593,10 @@ void HSubGameScene::showHLevelPickerLayer(std::function<void()> onLayerDismissed | @@ -593,10 +593,10 @@ void HSubGameScene::showHLevelPickerLayer(std::function<void()> onLayerDismissed | ||
593 | if(HMiscUtils::isNodeVisible(n)){ | 593 | if(HMiscUtils::isNodeVisible(n)){ |
594 | // HSoundUtils::stopAllSounds(); | 594 | // HSoundUtils::stopAllSounds(); |
595 | // cocos2d::AudioEngine::end(); | 595 | // cocos2d::AudioEngine::end(); |
596 | - //cocos2d::Director::getInstance()->end(); | 596 | + cocos2d::Director::getInstance()->end(); |
597 | 597 | ||
598 | - auto scene = HelloWorld::createScene(); | ||
599 | - cocos2d::Director::getInstance()->replaceScene(scene); | 598 | + //auto scene = HelloWorld::createScene(); |
599 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
600 | 600 | ||
601 | 601 | ||
602 | 602 |
ios/Runner/Wowgame/Classes/game_toy/ToyMainMenuScene.cpp
@@ -343,9 +343,9 @@ void ToyMainMenuScene::showTOSAcceptPopup(std::function<void()> onAccept){ | @@ -343,9 +343,9 @@ void ToyMainMenuScene::showTOSAcceptPopup(std::function<void()> onAccept){ | ||
343 | } else { | 343 | } else { |
344 | 344 | ||
345 | 345 | ||
346 | - //cocos2d::Director::getInstance()->end(); | ||
347 | - auto scene = HelloWorld::createScene(); | ||
348 | - cocos2d::Director::getInstance()->replaceScene(scene); | 346 | + cocos2d::Director::getInstance()->end(); |
347 | + //auto scene = HelloWorld::createScene(); | ||
348 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
349 | 349 | ||
350 | 350 | ||
351 | } | 351 | } |
ios/Runner/Wowgame/Classes/game_toy/ToyMiscUtils.cpp
@@ -11,6 +11,14 @@ | @@ -11,6 +11,14 @@ | ||
11 | #include "ToyGeometryUtils.h" | 11 | #include "ToyGeometryUtils.h" |
12 | #include "ToyAlertView.h" | 12 | #include "ToyAlertView.h" |
13 | #include "HelloWorldScene.h" | 13 | #include "HelloWorldScene.h" |
14 | + | ||
15 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
16 | +#include "RatePromptHandler_ios.h" | ||
17 | +#endif | ||
18 | + | ||
19 | +#include "audio/include/AudioEngine.h" | ||
20 | + | ||
21 | + | ||
14 | float ToyMiscUtils::StandardAnimationTime = 0.2; | 22 | float ToyMiscUtils::StandardAnimationTime = 0.2; |
15 | const std::string ToyMiscUtils::MAGGIE_TOUCHED_UD_KEY = "MAGGIE_TOUCHED_UD_KEY"; | 23 | const std::string ToyMiscUtils::MAGGIE_TOUCHED_UD_KEY = "MAGGIE_TOUCHED_UD_KEY"; |
16 | const std::string ToyMiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY"; | 24 | const std::string ToyMiscUtils::WHICH_LEVEL_UD_KEY = "WHICH_LEVEL_UD_KEY"; |
@@ -196,12 +204,18 @@ void ToyMiscUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallb | @@ -196,12 +204,18 @@ void ToyMiscUtils::showAppCloseConfirmDialog(std::function<void()> onCancelCallb | ||
196 | 204 | ||
197 | auto alert = ToyAlertView::create(message, okText, cancelText, okColor, cancelColor, []() { | 205 | auto alert = ToyAlertView::create(message, okText, cancelText, okColor, cancelColor, []() { |
198 | 206 | ||
199 | - | ||
200 | - //cocos2d::Director::getInstance()->end(); | ||
201 | - auto scene = HelloWorld::createScene(); | ||
202 | - cocos2d::Director::getInstance()->replaceScene(scene); | ||
203 | - | ||
204 | - | 207 | +#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) |
208 | + cocos2d::Director::getInstance()->end(); | ||
209 | +#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) | ||
210 | + cocos2d::AudioEngine::stopAll(); | ||
211 | + cocos2d::Director::getInstance()->pause(); | ||
212 | + handler_nativeExitGame(); | ||
213 | +#else | ||
214 | + cocos2d::Director::getInstance()->end(); | ||
215 | +#endif | ||
216 | + | ||
217 | + // auto scene = HelloWorld::createScene(); | ||
218 | + // cocos2d::Director::getInstance()->replaceScene(scene); | ||
205 | 219 | ||
206 | }, onCancelCallback); | 220 | }, onCancelCallback); |
207 | auto touchListener = cocos2d::EventListenerTouchOneByOne::create(); | 221 | auto touchListener = cocos2d::EventListenerTouchOneByOne::create(); |
ios/Runner/Wowgame/Classes/game_toy/ToyParentScene.cpp
@@ -497,10 +497,10 @@ void ToyParentScene::showTOSAcceptPopup(std::function<void()> onAccept){ | @@ -497,10 +497,10 @@ void ToyParentScene::showTOSAcceptPopup(std::function<void()> onAccept){ | ||
497 | if (n->isShowingParentalGate()) { | 497 | if (n->isShowingParentalGate()) { |
498 | n->hideParentalGate(); | 498 | n->hideParentalGate(); |
499 | } else { | 499 | } else { |
500 | - //cocos2d::Director::getInstance()->end(); | 500 | + cocos2d::Director::getInstance()->end(); |
501 | 501 | ||
502 | - auto scene = HelloWorld::createScene(); | ||
503 | - cocos2d::Director::getInstance()->replaceScene(scene); | 502 | + //auto scene = HelloWorld::createScene(); |
503 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
504 | 504 | ||
505 | 505 | ||
506 | } | 506 | } |
@@ -523,9 +523,9 @@ void ToyParentScene::showToyLevelPickerLayer(std::function<void()> onLayerDismis | @@ -523,9 +523,9 @@ void ToyParentScene::showToyLevelPickerLayer(std::function<void()> onLayerDismis | ||
523 | keyboardListener->onKeyReleased = std::bind([&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event, cocos2d::Node* n){ | 523 | keyboardListener->onKeyReleased = std::bind([&](cocos2d::EventKeyboard::KeyCode keyCode, cocos2d::Event* event, cocos2d::Node* n){ |
524 | if(keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK){ | 524 | if(keyCode == cocos2d::EventKeyboard::KeyCode::KEY_BACK){ |
525 | if(ToyMiscUtils::isNodeVisible(n)){ | 525 | if(ToyMiscUtils::isNodeVisible(n)){ |
526 | - //cocos2d::Director::getInstance()->end(); | ||
527 | - auto scene = HelloWorld::createScene(); | ||
528 | - cocos2d::Director::getInstance()->replaceScene(scene); | 526 | + cocos2d::Director::getInstance()->end(); |
527 | + //auto scene = HelloWorld::createScene(); | ||
528 | + //cocos2d::Director::getInstance()->replaceScene(scene); | ||
529 | 529 | ||
530 | 530 | ||
531 | 531 |
ios/Runner/Wowgame/Classes/game_toy/ToySettingsLayer.cpp
@@ -76,13 +76,14 @@ bool ToySettingsLayer::init(float width, float height, std::function<void(int)> | @@ -76,13 +76,14 @@ bool ToySettingsLayer::init(float width, float height, std::function<void(int)> | ||
76 | 76 | ||
77 | auto webLinkButton = ToySimpleButton::create(); | 77 | auto webLinkButton = ToySimpleButton::create(); |
78 | wholeContainer->addChild(webLinkButton); | 78 | wholeContainer->addChild(webLinkButton); |
79 | + webLinkButton->setVisible(false); | ||
79 | auto buttonTexturePath = "settings_buttons/steve_maggie.png"; | 80 | auto buttonTexturePath = "settings_buttons/steve_maggie.png"; |
80 | webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); | 81 | webLinkButton->loadTextures(buttonTexturePath, buttonTexturePath, buttonTexturePath); |
81 | webLinkButton->setPosition(cocos2d::Point(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingTop*2 - webLinkButton->getBoundingBox().size.height/2)); | 82 | webLinkButton->setPosition(cocos2d::Point(getContentSize().width/2, upperStuffContainer->getBoundingBox().getMinY() - paddingTop*2 - webLinkButton->getBoundingBox().size.height/2)); |
82 | webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ | 83 | webLinkButton->setOnTouchEndedCallback([&, webLinkButton](std::string name, cocos2d::ui::Widget::TouchEventType eventType){ |
83 | // presentParentalGate([&](){ | 84 | // presentParentalGate([&](){ |
84 | // hideParentalGate(); | 85 | // hideParentalGate(); |
85 | - cocos2d::Application::getInstance()->openURL("https://www.steveandmaggie.com"); //TODO hardcoded | 86 | +// cocos2d::Application::getInstance()->openURL("https://www.steveandmaggie.com"); //TODO hardcoded |
86 | // }, [&](){ | 87 | // }, [&](){ |
87 | // hideParentalGate(); | 88 | // hideParentalGate(); |
88 | // }); | 89 | // }); |
ios/Runner/Wowgame/Resources/CloseNormal.png deleted
3.51 KB
ios/Runner/Wowgame/Resources/CloseSelected.png deleted
2.74 KB
ios/Runner/Wowgame/Resources/HelloWorld.png deleted
37 KB
ios/Runner/Wowgame/Resources/game_animal/xlarge/buttons/graphics/button_x.png
0 → 100644
10.4 KB
ios/Runner/Wowgame/WowGameClasses/WowGameCocosManager.h
ios/Runner/Wowgame/WowGameClasses/WowGameCocosManager.mm
@@ -7,7 +7,8 @@ | @@ -7,7 +7,8 @@ | ||
7 | 7 | ||
8 | #import "WowGameCocosManager.h" | 8 | #import "WowGameCocosManager.h" |
9 | 9 | ||
10 | -#import "cocos2d.h" | 10 | +#include "cocos2d.h" |
11 | + | ||
11 | #import "CocosAppDelegate.h" | 12 | #import "CocosAppDelegate.h" |
12 | 13 | ||
13 | @interface WowGameCocosManager () { | 14 | @interface WowGameCocosManager () { |
@@ -41,9 +42,15 @@ static CocosAppDelegate cocosAppDelegate; | @@ -41,9 +42,15 @@ static CocosAppDelegate cocosAppDelegate; | ||
41 | cocos2d::GLViewImpl::convertAttrs(); | 42 | cocos2d::GLViewImpl::convertAttrs(); |
42 | 43 | ||
43 | _app = app; | 44 | _app = app; |
45 | + | ||
46 | + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitGame) name:@"_kwowgamecocosexitgame" object:nil]; | ||
47 | +} | ||
48 | + | ||
49 | +- (void)exitGame { | ||
50 | + [self.gameViewController dismissViewControllerAnimated:YES completion:nil]; | ||
44 | } | 51 | } |
45 | 52 | ||
46 | -- (void)runGame { | 53 | +- (void)runGame:(NSInteger)gameid { |
47 | UIWindow *window = UIApplication.sharedApplication.delegate.window; | 54 | UIWindow *window = UIApplication.sharedApplication.delegate.window; |
48 | UIViewController *rootvc = window.rootViewController; | 55 | UIViewController *rootvc = window.rootViewController; |
49 | if ([rootvc isKindOfClass:WowGameViewController.class]) { | 56 | if ([rootvc isKindOfClass:WowGameViewController.class]) { |
@@ -52,35 +59,38 @@ static CocosAppDelegate cocosAppDelegate; | @@ -52,35 +59,38 @@ static CocosAppDelegate cocosAppDelegate; | ||
52 | if (!self.gameViewController) { | 59 | if (!self.gameViewController) { |
53 | WowGameViewController *cocosvc = [[WowGameViewController alloc] init]; | 60 | WowGameViewController *cocosvc = [[WowGameViewController alloc] init]; |
54 | cocosvc.wantsFullScreenLayout = YES; | 61 | cocosvc.wantsFullScreenLayout = YES; |
55 | -// self.gameViewController = cocosvc; | 62 | + self.gameViewController = cocosvc; |
56 | 63 | ||
57 | cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)cocosvc.view); | 64 | cocos2d::GLView *glview = cocos2d::GLViewImpl::createWithEAGLView((__bridge void *)cocosvc.view); |
58 | cocos2d::Director::getInstance()->setOpenGLView(glview); | 65 | cocos2d::Director::getInstance()->setOpenGLView(glview); |
59 | _app->run(); | 66 | _app->run(); |
60 | - [rootvc presentViewController:cocosvc animated:YES completion:nil]; | ||
61 | -// return; | ||
62 | } else { | 67 | } else { |
63 | - [self cocosWillEnterForeground]; | 68 | + cocos2d::Director::getInstance()->resume(); |
64 | } | 69 | } |
65 | -// | 70 | + |
66 | [rootvc presentViewController:self.gameViewController animated:YES completion:nil]; | 71 | [rootvc presentViewController:self.gameViewController animated:YES completion:nil]; |
67 | 72 | ||
68 | -// debug exit game | ||
69 | - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||
70 | - [self popGame]; | ||
71 | -// [self cocosDidEnterBackground]; | ||
72 | -// [rootvc dismissViewControllerAnimated:YES completion:nil]; | ||
73 | - | ||
74 | -// [self cocosDidEnterBackground]; | 73 | + [self startGameWithID:gameid]; |
74 | + | ||
75 | +//// debug exit game | ||
76 | +// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ | ||
77 | +// [self exitGame]; | ||
78 | +// }); | ||
79 | +} | ||
80 | + | ||
81 | +-(void)startGameWithID:(NSInteger)gameid { | ||
82 | + cocos2d::Director::getInstance()->getScheduler()->performFunctionInCocosThread([=] { | ||
83 | +// CCLOG("start gameid---> %d ", gameid); | ||
84 | + cocos2d::EventCustom evtEnter("start_gameid"); | ||
85 | + evtEnter.setUserData((void *) gameid); | ||
86 | + cocos2d::Director::getInstance()->getEventDispatcher()->dispatchEvent(&evtEnter); | ||
75 | }); | 87 | }); |
76 | } | 88 | } |
77 | 89 | ||
78 | - (void)popGame { | 90 | - (void)popGame { |
79 | [self.gameViewController dismissViewControllerAnimated:YES completion:nil]; | 91 | [self.gameViewController dismissViewControllerAnimated:YES completion:nil]; |
80 | 92 | ||
81 | - [self cocosDidEnterBackground]; | ||
82 | -// cocos2d::Director::getInstance()->end(); | ||
83 | - | 93 | +// [self cocosDidEnterBackground]; |
84 | } | 94 | } |
85 | 95 | ||
86 | 96 |
ios/cocos2d/cocos/base/CCDirector.cpp
lib/app/app.dart
@@ -3,8 +3,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | @@ -3,8 +3,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | ||
3 | import 'package:flutter_easyloading/flutter_easyloading.dart'; | 3 | import 'package:flutter_easyloading/flutter_easyloading.dart'; |
4 | import 'package:flutter_screenutil/flutter_screenutil.dart'; | 4 | import 'package:flutter_screenutil/flutter_screenutil.dart'; |
5 | import 'package:responsive_framework/responsive_framework.dart'; | 5 | import 'package:responsive_framework/responsive_framework.dart'; |
6 | -// import 'package:responsive_framework/breakpoint.dart'; | ||
7 | -// import 'package:responsive_framework/responsive_breakpoints.dart'; | ||
8 | import 'package:wow_english/common/blocs/cachebloc/cache_bloc.dart'; | 6 | import 'package:wow_english/common/blocs/cachebloc/cache_bloc.dart'; |
9 | import 'package:wow_english/common/widgets/hide_keyboard_widget.dart'; | 7 | import 'package:wow_english/common/widgets/hide_keyboard_widget.dart'; |
10 | import 'package:wow_english/pages/tab/blocs/tab_bloc.dart'; | 8 | import 'package:wow_english/pages/tab/blocs/tab_bloc.dart'; |
lib/app/splash_page.dart
@@ -69,7 +69,7 @@ class _TransitionViewState extends State<TransitionView> { | @@ -69,7 +69,7 @@ class _TransitionViewState extends State<TransitionView> { | ||
69 | } else { | 69 | } else { |
70 | pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); | 70 | pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); |
71 | }*/ | 71 | }*/ |
72 | - pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); | 72 | + pushNamedAndRemoveUntil(AppRouteName.moduleSelect, (route) => false); |
73 | }); | 73 | }); |
74 | } | 74 | } |
75 | 75 |
lib/common/request/apis.dart
@@ -82,4 +82,14 @@ class Apis { | @@ -82,4 +82,14 @@ class Apis { | ||
82 | 82 | ||
83 | /// 退出课堂 | 83 | /// 退出课堂 |
84 | static const String exitClass = 'course/exit/class'; | 84 | static const String exitClass = 'course/exit/class'; |
85 | + | ||
86 | + /// 商品列表 | ||
87 | + static const String productList = 'order/course/combo/list'; | ||
88 | + | ||
89 | + /// 创建订单 | ||
90 | + static const String createOrder = 'order/create/order'; | ||
91 | + | ||
92 | + /// 获取阿里支付token | ||
93 | + static const String getAliPayToken = 'pay/alipay/token'; | ||
94 | + | ||
85 | } | 95 | } |
lib/common/request/dao/shop_dao.dart
0 → 100644
1 | +import '../../../models/product_entity.dart'; | ||
2 | +import '../request_client.dart'; | ||
3 | + | ||
4 | +class ShopDao { | ||
5 | + ///商品列表 | ||
6 | + static Future productList() async { | ||
7 | + return await requestClient.get<List<ProductEntity?>>(Apis.productList); | ||
8 | + } | ||
9 | + | ||
10 | + ///创建订单 | ||
11 | + static Future createOrder(ProductEntity productEntity) async { | ||
12 | + return await requestClient | ||
13 | + .post<Map<String, dynamic>>(Apis.createOrder, data: {'courseComboId': productEntity.id}); | ||
14 | + } | ||
15 | + | ||
16 | + ///获取ali支付订单信息 | ||
17 | + static Future getAliPayToken(String orderNo) async { | ||
18 | + return await requestClient | ||
19 | + .post<Map<String, dynamic>>(Apis.getAliPayToken, data: {'orderNo': orderNo}); | ||
20 | + } | ||
21 | +} |
lib/generated/json/aliyun_oss_upload_sts_entity.g.dart
1 | import 'package:wow_english/generated/json/base/json_convert_content.dart'; | 1 | import 'package:wow_english/generated/json/base/json_convert_content.dart'; |
2 | import 'package:wow_english/models/aliyun_oss_upload_sts_entity.dart'; | 2 | import 'package:wow_english/models/aliyun_oss_upload_sts_entity.dart'; |
3 | 3 | ||
4 | -AliyunOssUploadStsEntity $AliyunOssUploadStsEntityFromJson(Map<String, dynamic> json) { | ||
5 | - final AliyunOssUploadStsEntity aliyunOssUploadStsEntity = AliyunOssUploadStsEntity(); | ||
6 | - final String? securityToken = jsonConvert.convert<String>(json['securityToken']); | ||
7 | - if (securityToken != null) { | ||
8 | - aliyunOssUploadStsEntity.securityToken = securityToken; | ||
9 | - } | ||
10 | - final String? expiration = jsonConvert.convert<String>(json['expiration']); | ||
11 | - if (expiration != null) { | ||
12 | - aliyunOssUploadStsEntity.expiration = expiration; | ||
13 | - } | ||
14 | - final String? endpoint = jsonConvert.convert<String>(json['endpoint']); | ||
15 | - if (endpoint != null) { | ||
16 | - aliyunOssUploadStsEntity.endpoint = endpoint; | ||
17 | - } | ||
18 | - final String? fileKey = jsonConvert.convert<String>(json['fileKey']); | ||
19 | - if (fileKey != null) { | ||
20 | - aliyunOssUploadStsEntity.fileKey = fileKey; | ||
21 | - } | ||
22 | - final String? accessKeyId = jsonConvert.convert<String>(json['accessKeyId']); | ||
23 | - if (accessKeyId != null) { | ||
24 | - aliyunOssUploadStsEntity.accessKeyId = accessKeyId; | ||
25 | - } | ||
26 | - final String? accessKeySecret = jsonConvert.convert<String>(json['accessKeySecret']); | ||
27 | - if (accessKeySecret != null) { | ||
28 | - aliyunOssUploadStsEntity.accessKeySecret = accessKeySecret; | ||
29 | - } | ||
30 | - final String? bucket = jsonConvert.convert<String>(json['bucket']); | ||
31 | - if (bucket != null) { | ||
32 | - aliyunOssUploadStsEntity.bucket = bucket; | ||
33 | - } | ||
34 | - final String? ossDomain = jsonConvert.convert<String>(json['ossDomain']); | ||
35 | - if (ossDomain != null) { | ||
36 | - aliyunOssUploadStsEntity.ossDomain = ossDomain; | ||
37 | - } | ||
38 | - final String? host = jsonConvert.convert<String>(json['host']); | ||
39 | - if (host != null) { | ||
40 | - aliyunOssUploadStsEntity.host = host; | ||
41 | - } | ||
42 | - final AliyunOssUploadStsCallbackParam? callbackParam = jsonConvert.convert<AliyunOssUploadStsCallbackParam>(json['callbackParam']); | ||
43 | - if (callbackParam != null) { | ||
44 | - aliyunOssUploadStsEntity.callbackParam = callbackParam; | ||
45 | - } | ||
46 | - return aliyunOssUploadStsEntity; | 4 | +AliyunOssUploadStsEntity $AliyunOssUploadStsEntityFromJson( |
5 | + Map<String, dynamic> json) { | ||
6 | + final AliyunOssUploadStsEntity aliyunOssUploadStsEntity = AliyunOssUploadStsEntity(); | ||
7 | + final String? securityToken = jsonConvert.convert<String>( | ||
8 | + json['securityToken']); | ||
9 | + if (securityToken != null) { | ||
10 | + aliyunOssUploadStsEntity.securityToken = securityToken; | ||
11 | + } | ||
12 | + final String? expiration = jsonConvert.convert<String>(json['expiration']); | ||
13 | + if (expiration != null) { | ||
14 | + aliyunOssUploadStsEntity.expiration = expiration; | ||
15 | + } | ||
16 | + final String? endpoint = jsonConvert.convert<String>(json['endpoint']); | ||
17 | + if (endpoint != null) { | ||
18 | + aliyunOssUploadStsEntity.endpoint = endpoint; | ||
19 | + } | ||
20 | + final String? fileKey = jsonConvert.convert<String>(json['fileKey']); | ||
21 | + if (fileKey != null) { | ||
22 | + aliyunOssUploadStsEntity.fileKey = fileKey; | ||
23 | + } | ||
24 | + final String? accessKeyId = jsonConvert.convert<String>(json['accessKeyId']); | ||
25 | + if (accessKeyId != null) { | ||
26 | + aliyunOssUploadStsEntity.accessKeyId = accessKeyId; | ||
27 | + } | ||
28 | + final String? accessKeySecret = jsonConvert.convert<String>( | ||
29 | + json['accessKeySecret']); | ||
30 | + if (accessKeySecret != null) { | ||
31 | + aliyunOssUploadStsEntity.accessKeySecret = accessKeySecret; | ||
32 | + } | ||
33 | + final String? bucket = jsonConvert.convert<String>(json['bucket']); | ||
34 | + if (bucket != null) { | ||
35 | + aliyunOssUploadStsEntity.bucket = bucket; | ||
36 | + } | ||
37 | + final String? ossDomain = jsonConvert.convert<String>(json['ossDomain']); | ||
38 | + if (ossDomain != null) { | ||
39 | + aliyunOssUploadStsEntity.ossDomain = ossDomain; | ||
40 | + } | ||
41 | + final String? host = jsonConvert.convert<String>(json['host']); | ||
42 | + if (host != null) { | ||
43 | + aliyunOssUploadStsEntity.host = host; | ||
44 | + } | ||
45 | + final AliyunOssUploadStsCallbackParam? callbackParam = jsonConvert.convert< | ||
46 | + AliyunOssUploadStsCallbackParam>(json['callbackParam']); | ||
47 | + if (callbackParam != null) { | ||
48 | + aliyunOssUploadStsEntity.callbackParam = callbackParam; | ||
49 | + } | ||
50 | + return aliyunOssUploadStsEntity; | ||
47 | } | 51 | } |
48 | 52 | ||
49 | -Map<String, dynamic> $AliyunOssUploadStsEntityToJson(AliyunOssUploadStsEntity entity) { | ||
50 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
51 | - data['securityToken'] = entity.securityToken; | ||
52 | - data['expiration'] = entity.expiration; | ||
53 | - data['endpoint'] = entity.endpoint; | ||
54 | - data['fileKey'] = entity.fileKey; | ||
55 | - data['accessKeyId'] = entity.accessKeyId; | ||
56 | - data['accessKeySecret'] = entity.accessKeySecret; | ||
57 | - data['bucket'] = entity.bucket; | ||
58 | - data['ossDomain'] = entity.ossDomain; | ||
59 | - data['host'] = entity.host; | ||
60 | - data['callbackParam'] = entity.callbackParam.toJson(); | ||
61 | - return data; | 53 | +Map<String, dynamic> $AliyunOssUploadStsEntityToJson( |
54 | + AliyunOssUploadStsEntity entity) { | ||
55 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
56 | + data['securityToken'] = entity.securityToken; | ||
57 | + data['expiration'] = entity.expiration; | ||
58 | + data['endpoint'] = entity.endpoint; | ||
59 | + data['fileKey'] = entity.fileKey; | ||
60 | + data['accessKeyId'] = entity.accessKeyId; | ||
61 | + data['accessKeySecret'] = entity.accessKeySecret; | ||
62 | + data['bucket'] = entity.bucket; | ||
63 | + data['ossDomain'] = entity.ossDomain; | ||
64 | + data['host'] = entity.host; | ||
65 | + data['callbackParam'] = entity.callbackParam.toJson(); | ||
66 | + return data; | ||
62 | } | 67 | } |
63 | 68 | ||
64 | -AliyunOssUploadStsCallbackParam $AliyunOssUploadStsCallbackParamFromJson(Map<String, dynamic> json) { | ||
65 | - final AliyunOssUploadStsCallbackParam aliyunOssUploadStsCallbackParam = AliyunOssUploadStsCallbackParam(); | ||
66 | - final String? callbackBody = jsonConvert.convert<String>(json['callbackBody']); | ||
67 | - if (callbackBody != null) { | ||
68 | - aliyunOssUploadStsCallbackParam.callbackBody = callbackBody; | ||
69 | - } | ||
70 | - final String? callbackBodyType = jsonConvert.convert<String>(json['callbackBodyType']); | ||
71 | - if (callbackBodyType != null) { | ||
72 | - aliyunOssUploadStsCallbackParam.callbackBodyType = callbackBodyType; | ||
73 | - } | ||
74 | - final String? callbackUrl = jsonConvert.convert<String>(json['callbackUrl']); | ||
75 | - if (callbackUrl != null) { | ||
76 | - aliyunOssUploadStsCallbackParam.callbackUrl = callbackUrl; | ||
77 | - } | ||
78 | - return aliyunOssUploadStsCallbackParam; | 69 | +extension AliyunOssUploadStsEntityExtension on AliyunOssUploadStsEntity { |
70 | + AliyunOssUploadStsEntity copyWith({ | ||
71 | + String? securityToken, | ||
72 | + String? expiration, | ||
73 | + String? endpoint, | ||
74 | + String? fileKey, | ||
75 | + String? accessKeyId, | ||
76 | + String? accessKeySecret, | ||
77 | + String? bucket, | ||
78 | + String? ossDomain, | ||
79 | + String? host, | ||
80 | + AliyunOssUploadStsCallbackParam? callbackParam, | ||
81 | + }) { | ||
82 | + return AliyunOssUploadStsEntity() | ||
83 | + ..securityToken = securityToken ?? this.securityToken | ||
84 | + ..expiration = expiration ?? this.expiration | ||
85 | + ..endpoint = endpoint ?? this.endpoint | ||
86 | + ..fileKey = fileKey ?? this.fileKey | ||
87 | + ..accessKeyId = accessKeyId ?? this.accessKeyId | ||
88 | + ..accessKeySecret = accessKeySecret ?? this.accessKeySecret | ||
89 | + ..bucket = bucket ?? this.bucket | ||
90 | + ..ossDomain = ossDomain ?? this.ossDomain | ||
91 | + ..host = host ?? this.host | ||
92 | + ..callbackParam = callbackParam ?? this.callbackParam; | ||
93 | + } | ||
79 | } | 94 | } |
80 | 95 | ||
81 | -Map<String, dynamic> $AliyunOssUploadStsCallbackParamToJson(AliyunOssUploadStsCallbackParam entity) { | ||
82 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
83 | - data['callbackBody'] = entity.callbackBody; | ||
84 | - data['callbackBodyType'] = entity.callbackBodyType; | ||
85 | - data['callbackUrl'] = entity.callbackUrl; | ||
86 | - return data; | 96 | +AliyunOssUploadStsCallbackParam $AliyunOssUploadStsCallbackParamFromJson( |
97 | + Map<String, dynamic> json) { | ||
98 | + final AliyunOssUploadStsCallbackParam aliyunOssUploadStsCallbackParam = AliyunOssUploadStsCallbackParam(); | ||
99 | + final String? callbackBody = jsonConvert.convert<String>( | ||
100 | + json['callbackBody']); | ||
101 | + if (callbackBody != null) { | ||
102 | + aliyunOssUploadStsCallbackParam.callbackBody = callbackBody; | ||
103 | + } | ||
104 | + final String? callbackBodyType = jsonConvert.convert<String>( | ||
105 | + json['callbackBodyType']); | ||
106 | + if (callbackBodyType != null) { | ||
107 | + aliyunOssUploadStsCallbackParam.callbackBodyType = callbackBodyType; | ||
108 | + } | ||
109 | + final String? callbackUrl = jsonConvert.convert<String>(json['callbackUrl']); | ||
110 | + if (callbackUrl != null) { | ||
111 | + aliyunOssUploadStsCallbackParam.callbackUrl = callbackUrl; | ||
112 | + } | ||
113 | + return aliyunOssUploadStsCallbackParam; | ||
87 | } | 114 | } |
115 | + | ||
116 | +Map<String, dynamic> $AliyunOssUploadStsCallbackParamToJson( | ||
117 | + AliyunOssUploadStsCallbackParam entity) { | ||
118 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
119 | + data['callbackBody'] = entity.callbackBody; | ||
120 | + data['callbackBodyType'] = entity.callbackBodyType; | ||
121 | + data['callbackUrl'] = entity.callbackUrl; | ||
122 | + return data; | ||
123 | +} | ||
124 | + | ||
125 | +extension AliyunOssUploadStsCallbackParamExtension on AliyunOssUploadStsCallbackParam { | ||
126 | + AliyunOssUploadStsCallbackParam copyWith({ | ||
127 | + String? callbackBody, | ||
128 | + String? callbackBodyType, | ||
129 | + String? callbackUrl, | ||
130 | + }) { | ||
131 | + return AliyunOssUploadStsCallbackParam() | ||
132 | + ..callbackBody = callbackBody ?? this.callbackBody | ||
133 | + ..callbackBodyType = callbackBodyType ?? this.callbackBodyType | ||
134 | + ..callbackUrl = callbackUrl ?? this.callbackUrl; | ||
135 | + } | ||
136 | +} | ||
88 | \ No newline at end of file | 137 | \ No newline at end of file |
lib/generated/json/base/json_convert_content.dart
@@ -10,30 +10,47 @@ import 'package:wow_english/models/course_module_entity.dart'; | @@ -10,30 +10,47 @@ import 'package:wow_english/models/course_module_entity.dart'; | ||
10 | import 'package:wow_english/models/course_process_entity.dart'; | 10 | import 'package:wow_english/models/course_process_entity.dart'; |
11 | import 'package:wow_english/models/follow_read_entity.dart'; | 11 | import 'package:wow_english/models/follow_read_entity.dart'; |
12 | import 'package:wow_english/models/listen_entity.dart'; | 12 | import 'package:wow_english/models/listen_entity.dart'; |
13 | +import 'package:wow_english/models/product_entity.dart'; | ||
13 | import 'package:wow_english/models/read_content_entity.dart'; | 14 | import 'package:wow_english/models/read_content_entity.dart'; |
14 | import 'package:wow_english/models/user_entity.dart'; | 15 | import 'package:wow_english/models/user_entity.dart'; |
15 | 16 | ||
16 | JsonConvert jsonConvert = JsonConvert(); | 17 | JsonConvert jsonConvert = JsonConvert(); |
18 | + | ||
17 | typedef JsonConvertFunction<T> = T Function(Map<String, dynamic> json); | 19 | typedef JsonConvertFunction<T> = T Function(Map<String, dynamic> json); |
18 | typedef EnumConvertFunction<T> = T Function(String value); | 20 | typedef EnumConvertFunction<T> = T Function(String value); |
21 | +typedef ConvertExceptionHandler = void Function(Object error, StackTrace stackTrace); | ||
22 | +extension MapSafeExt<K, V> on Map<K, V> { | ||
23 | + T? getOrNull<T>(K? key) { | ||
24 | + if (!containsKey(key) || key == null) { | ||
25 | + return null; | ||
26 | + } else { | ||
27 | + return this[key] as T?; | ||
28 | + } | ||
29 | + } | ||
30 | +} | ||
19 | 31 | ||
20 | class JsonConvert { | 32 | class JsonConvert { |
21 | - static final Map<String, JsonConvertFunction> convertFuncMap = { | ||
22 | - (AliyunOssUploadStsEntity).toString(): AliyunOssUploadStsEntity.fromJson, | ||
23 | - (AliyunOssUploadStsCallbackParam).toString(): AliyunOssUploadStsCallbackParam.fromJson, | ||
24 | - (CourseEntity).toString(): CourseEntity.fromJson, | ||
25 | - (CourseCourseLessons).toString(): CourseCourseLessons.fromJson, | ||
26 | - (CourseModuleEntity).toString(): CourseModuleEntity.fromJson, | ||
27 | - (CourseProcessEntity).toString(): CourseProcessEntity.fromJson, | ||
28 | - (CourseProcessReadings).toString(): CourseProcessReadings.fromJson, | ||
29 | - (CourseProcessTopics).toString(): CourseProcessTopics.fromJson, | ||
30 | - (CourseProcessTopicsTopicAnswerList).toString(): CourseProcessTopicsTopicAnswerList.fromJson, | ||
31 | - (CourseProcessVideos).toString(): CourseProcessVideos.fromJson, | ||
32 | - (FollowReadEntity).toString(): FollowReadEntity.fromJson, | ||
33 | - (ListenEntity).toString(): ListenEntity.fromJson, | ||
34 | - (ReadContentEntity).toString(): ReadContentEntity.fromJson, | ||
35 | - (UserEntity).toString(): UserEntity.fromJson, | ||
36 | - }; | 33 | + static ConvertExceptionHandler? onError; |
34 | + JsonConvertClassCollection convertFuncMap = JsonConvertClassCollection(); | ||
35 | + | ||
36 | + /// When you are in the development, to generate a new model class, hot-reload doesn't find new generation model class, you can build on MaterialApp method called jsonConvert. ReassembleConvertFuncMap (); This method only works in a development environment | ||
37 | + /// https://flutter.cn/docs/development/tools/hot-reload | ||
38 | + /// class MyApp extends StatelessWidget { | ||
39 | + /// const MyApp({Key? key}) | ||
40 | + /// : super(key: key); | ||
41 | + /// | ||
42 | + /// @override | ||
43 | + /// Widget build(BuildContext context) { | ||
44 | + /// jsonConvert.reassembleConvertFuncMap(); | ||
45 | + /// return MaterialApp(); | ||
46 | + /// } | ||
47 | + /// } | ||
48 | + void reassembleConvertFuncMap() { | ||
49 | + bool isReleaseMode = const bool.fromEnvironment('dart.vm.product'); | ||
50 | + if (!isReleaseMode) { | ||
51 | + convertFuncMap = JsonConvertClassCollection(); | ||
52 | + } | ||
53 | + } | ||
37 | 54 | ||
38 | T? convert<T>(dynamic value, {EnumConvertFunction? enumConvert}) { | 55 | T? convert<T>(dynamic value, {EnumConvertFunction? enumConvert}) { |
39 | if (value == null) { | 56 | if (value == null) { |
@@ -46,30 +63,43 @@ class JsonConvert { | @@ -46,30 +63,43 @@ class JsonConvert { | ||
46 | return _asT<T>(value, enumConvert: enumConvert); | 63 | return _asT<T>(value, enumConvert: enumConvert); |
47 | } catch (e, stackTrace) { | 64 | } catch (e, stackTrace) { |
48 | debugPrint('asT<$T> $e $stackTrace'); | 65 | debugPrint('asT<$T> $e $stackTrace'); |
66 | + if (onError != null) { | ||
67 | + onError!(e, stackTrace); | ||
68 | + } | ||
49 | return null; | 69 | return null; |
50 | } | 70 | } |
51 | } | 71 | } |
52 | 72 | ||
53 | - List<T?>? convertList<T>(List<dynamic>? value, {EnumConvertFunction? enumConvert}) { | 73 | + List<T?>? convertList<T>(List<dynamic>? value, |
74 | + {EnumConvertFunction? enumConvert}) { | ||
54 | if (value == null) { | 75 | if (value == null) { |
55 | return null; | 76 | return null; |
56 | } | 77 | } |
57 | try { | 78 | try { |
58 | - return value.map((dynamic e) => _asT<T>(e,enumConvert: enumConvert)).toList(); | 79 | + return value.map((dynamic e) => _asT<T>(e, enumConvert: enumConvert)) |
80 | + .toList(); | ||
59 | } catch (e, stackTrace) { | 81 | } catch (e, stackTrace) { |
60 | debugPrint('asT<$T> $e $stackTrace'); | 82 | debugPrint('asT<$T> $e $stackTrace'); |
83 | + if (onError != null) { | ||
84 | + onError!(e, stackTrace); | ||
85 | + } | ||
61 | return <T>[]; | 86 | return <T>[]; |
62 | } | 87 | } |
63 | } | 88 | } |
64 | 89 | ||
65 | -List<T>? convertListNotNull<T>(dynamic value, {EnumConvertFunction? enumConvert}) { | 90 | + List<T>? convertListNotNull<T>(dynamic value, |
91 | + {EnumConvertFunction? enumConvert}) { | ||
66 | if (value == null) { | 92 | if (value == null) { |
67 | return null; | 93 | return null; |
68 | } | 94 | } |
69 | try { | 95 | try { |
70 | - return (value as List<dynamic>).map((dynamic e) => _asT<T>(e,enumConvert: enumConvert)!).toList(); | 96 | + return (value as List<dynamic>).map((dynamic e) => |
97 | + _asT<T>(e, enumConvert: enumConvert)!).toList(); | ||
71 | } catch (e, stackTrace) { | 98 | } catch (e, stackTrace) { |
72 | debugPrint('asT<$T> $e $stackTrace'); | 99 | debugPrint('asT<$T> $e $stackTrace'); |
100 | + if (onError != null) { | ||
101 | + onError!(e, stackTrace); | ||
102 | + } | ||
73 | return <T>[]; | 103 | return <T>[]; |
74 | } | 104 | } |
75 | } | 105 | } |
@@ -102,68 +132,126 @@ List<T>? convertListNotNull<T>(dynamic value, {EnumConvertFunction? enumConvert} | @@ -102,68 +132,126 @@ List<T>? convertListNotNull<T>(dynamic value, {EnumConvertFunction? enumConvert} | ||
102 | return value as T; | 132 | return value as T; |
103 | } else { | 133 | } else { |
104 | if (convertFuncMap.containsKey(type)) { | 134 | if (convertFuncMap.containsKey(type)) { |
105 | - return convertFuncMap[type]!(Map<String, dynamic>.from(value)) as T; | 135 | + if (value == null) { |
136 | + return null; | ||
137 | + } | ||
138 | + return convertFuncMap[type]!(value as Map<String, dynamic>) as T; | ||
106 | } else { | 139 | } else { |
107 | - throw UnimplementedError('$type unimplemented'); | 140 | + throw UnimplementedError( |
141 | + '$type unimplemented,you can try running the app again'); | ||
108 | } | 142 | } |
109 | } | 143 | } |
110 | } | 144 | } |
111 | 145 | ||
112 | - //list is returned by type | ||
113 | - static M? _getListChildType<M>(List<Map<String, dynamic>> data) { | ||
114 | - if(<AliyunOssUploadStsEntity>[] is M){ | ||
115 | - return data.map<AliyunOssUploadStsEntity>((Map<String, dynamic> e) => AliyunOssUploadStsEntity.fromJson(e)).toList() as M; | ||
116 | - } | ||
117 | - if(<AliyunOssUploadStsCallbackParam>[] is M){ | ||
118 | - return data.map<AliyunOssUploadStsCallbackParam>((Map<String, dynamic> e) => AliyunOssUploadStsCallbackParam.fromJson(e)).toList() as M; | ||
119 | - } | ||
120 | - if(<CourseEntity>[] is M){ | ||
121 | - return data.map<CourseEntity>((Map<String, dynamic> e) => CourseEntity.fromJson(e)).toList() as M; | ||
122 | - } | ||
123 | - if(<CourseCourseLessons>[] is M){ | ||
124 | - return data.map<CourseCourseLessons>((Map<String, dynamic> e) => CourseCourseLessons.fromJson(e)).toList() as M; | ||
125 | - } | ||
126 | - if(<CourseModuleEntity>[] is M){ | ||
127 | - return data.map<CourseModuleEntity>((Map<String, dynamic> e) => CourseModuleEntity.fromJson(e)).toList() as M; | ||
128 | - } | ||
129 | - if(<CourseProcessEntity>[] is M){ | ||
130 | - return data.map<CourseProcessEntity>((Map<String, dynamic> e) => CourseProcessEntity.fromJson(e)).toList() as M; | ||
131 | - } | ||
132 | - if(<CourseProcessReadings>[] is M){ | ||
133 | - return data.map<CourseProcessReadings>((Map<String, dynamic> e) => CourseProcessReadings.fromJson(e)).toList() as M; | ||
134 | - } | ||
135 | - if(<CourseProcessTopics>[] is M){ | ||
136 | - return data.map<CourseProcessTopics>((Map<String, dynamic> e) => CourseProcessTopics.fromJson(e)).toList() as M; | ||
137 | - } | ||
138 | - if(<CourseProcessTopicsTopicAnswerList>[] is M){ | ||
139 | - return data.map<CourseProcessTopicsTopicAnswerList>((Map<String, dynamic> e) => CourseProcessTopicsTopicAnswerList.fromJson(e)).toList() as M; | ||
140 | - } | ||
141 | - if(<CourseProcessVideos>[] is M){ | ||
142 | - return data.map<CourseProcessVideos>((Map<String, dynamic> e) => CourseProcessVideos.fromJson(e)).toList() as M; | ||
143 | - } | ||
144 | - if(<FollowReadEntity>[] is M){ | ||
145 | - return data.map<FollowReadEntity>((Map<String, dynamic> e) => FollowReadEntity.fromJson(e)).toList() as M; | ||
146 | - } | ||
147 | - if(<ListenEntity>[] is M){ | ||
148 | - return data.map<ListenEntity>((Map<String, dynamic> e) => ListenEntity.fromJson(e)).toList() as M; | ||
149 | - } | ||
150 | - if(<ReadContentEntity>[] is M){ | ||
151 | - return data.map<ReadContentEntity>((Map<String, dynamic> e) => ReadContentEntity.fromJson(e)).toList() as M; | ||
152 | - } | ||
153 | - if(<UserEntity>[] is M){ | ||
154 | - return data.map<UserEntity>((Map<String, dynamic> e) => UserEntity.fromJson(e)).toList() as M; | ||
155 | - } | ||
156 | - | ||
157 | - debugPrint("${M.toString()} not found"); | ||
158 | - | ||
159 | - return null; | ||
160 | -} | 146 | + //list is returned by type |
147 | + static M? _getListChildType<M>(List<Map<String, dynamic>> data) { | ||
148 | + if (<AliyunOssUploadStsEntity>[] is M) { | ||
149 | + return data.map<AliyunOssUploadStsEntity>((Map<String, dynamic> e) => | ||
150 | + AliyunOssUploadStsEntity.fromJson(e)).toList() as M; | ||
151 | + } | ||
152 | + if (<AliyunOssUploadStsCallbackParam>[] is M) { | ||
153 | + return data.map<AliyunOssUploadStsCallbackParam>(( | ||
154 | + Map<String, dynamic> e) => | ||
155 | + AliyunOssUploadStsCallbackParam.fromJson(e)).toList() as M; | ||
156 | + } | ||
157 | + if (<CourseEntity>[] is M) { | ||
158 | + return data.map<CourseEntity>((Map<String, dynamic> e) => | ||
159 | + CourseEntity.fromJson(e)).toList() as M; | ||
160 | + } | ||
161 | + if (<CourseCourseLessons>[] is M) { | ||
162 | + return data.map<CourseCourseLessons>((Map<String, dynamic> e) => | ||
163 | + CourseCourseLessons.fromJson(e)).toList() as M; | ||
164 | + } | ||
165 | + if (<CourseModuleEntity>[] is M) { | ||
166 | + return data.map<CourseModuleEntity>((Map<String, dynamic> e) => | ||
167 | + CourseModuleEntity.fromJson(e)).toList() as M; | ||
168 | + } | ||
169 | + if (<CourseProcessEntity>[] is M) { | ||
170 | + return data.map<CourseProcessEntity>((Map<String, dynamic> e) => | ||
171 | + CourseProcessEntity.fromJson(e)).toList() as M; | ||
172 | + } | ||
173 | + if (<CourseProcessReadings>[] is M) { | ||
174 | + return data.map<CourseProcessReadings>((Map<String, dynamic> e) => | ||
175 | + CourseProcessReadings.fromJson(e)).toList() as M; | ||
176 | + } | ||
177 | + if (<CourseProcessTopics>[] is M) { | ||
178 | + return data.map<CourseProcessTopics>((Map<String, dynamic> e) => | ||
179 | + CourseProcessTopics.fromJson(e)).toList() as M; | ||
180 | + } | ||
181 | + if (<CourseProcessTopicsTopicAnswerList>[] is M) { | ||
182 | + return data.map<CourseProcessTopicsTopicAnswerList>(( | ||
183 | + Map<String, dynamic> e) => | ||
184 | + CourseProcessTopicsTopicAnswerList.fromJson(e)).toList() as M; | ||
185 | + } | ||
186 | + if (<CourseProcessVideos>[] is M) { | ||
187 | + return data.map<CourseProcessVideos>((Map<String, dynamic> e) => | ||
188 | + CourseProcessVideos.fromJson(e)).toList() as M; | ||
189 | + } | ||
190 | + if (<FollowReadEntity>[] is M) { | ||
191 | + return data.map<FollowReadEntity>((Map<String, dynamic> e) => | ||
192 | + FollowReadEntity.fromJson(e)).toList() as M; | ||
193 | + } | ||
194 | + if (<ListenEntity>[] is M) { | ||
195 | + return data.map<ListenEntity>((Map<String, dynamic> e) => | ||
196 | + ListenEntity.fromJson(e)).toList() as M; | ||
197 | + } | ||
198 | + if (<ProductEntity>[] is M) { | ||
199 | + return data.map<ProductEntity>((Map<String, dynamic> e) => | ||
200 | + ProductEntity.fromJson(e)).toList() as M; | ||
201 | + } | ||
202 | + if (<ReadContentEntity>[] is M) { | ||
203 | + return data.map<ReadContentEntity>((Map<String, dynamic> e) => | ||
204 | + ReadContentEntity.fromJson(e)).toList() as M; | ||
205 | + } | ||
206 | + if (<UserEntity>[] is M) { | ||
207 | + return data.map<UserEntity>((Map<String, dynamic> e) => | ||
208 | + UserEntity.fromJson(e)).toList() as M; | ||
209 | + } | ||
161 | 210 | ||
162 | - static M? fromJsonAsT<M>(dynamic json) { | ||
163 | - if (json is List) { | ||
164 | - return _getListChildType<M>(json.map((e) => e as Map<String, dynamic>).toList()); | ||
165 | - } else { | ||
166 | - return jsonConvert.convert<M>(json); | ||
167 | - } | ||
168 | - } | 211 | + debugPrint("$M not found"); |
212 | + | ||
213 | + return null; | ||
214 | + } | ||
215 | + | ||
216 | + static M? fromJsonAsT<M>(dynamic json) { | ||
217 | + if (json is M) { | ||
218 | + return json; | ||
219 | + } | ||
220 | + if (json is List) { | ||
221 | + return _getListChildType<M>( | ||
222 | + json.map((dynamic e) => e as Map<String, dynamic>).toList()); | ||
223 | + } else { | ||
224 | + return jsonConvert.convert<M>(json); | ||
225 | + } | ||
226 | + } | ||
169 | } | 227 | } |
228 | + | ||
229 | +class JsonConvertClassCollection { | ||
230 | + Map<String, JsonConvertFunction> convertFuncMap = { | ||
231 | + (AliyunOssUploadStsEntity).toString(): AliyunOssUploadStsEntity.fromJson, | ||
232 | + (AliyunOssUploadStsCallbackParam) | ||
233 | + .toString(): AliyunOssUploadStsCallbackParam.fromJson, | ||
234 | + (CourseEntity).toString(): CourseEntity.fromJson, | ||
235 | + (CourseCourseLessons).toString(): CourseCourseLessons.fromJson, | ||
236 | + (CourseModuleEntity).toString(): CourseModuleEntity.fromJson, | ||
237 | + (CourseProcessEntity).toString(): CourseProcessEntity.fromJson, | ||
238 | + (CourseProcessReadings).toString(): CourseProcessReadings.fromJson, | ||
239 | + (CourseProcessTopics).toString(): CourseProcessTopics.fromJson, | ||
240 | + (CourseProcessTopicsTopicAnswerList) | ||
241 | + .toString(): CourseProcessTopicsTopicAnswerList.fromJson, | ||
242 | + (CourseProcessVideos).toString(): CourseProcessVideos.fromJson, | ||
243 | + (FollowReadEntity).toString(): FollowReadEntity.fromJson, | ||
244 | + (ListenEntity).toString(): ListenEntity.fromJson, | ||
245 | + (ProductEntity).toString(): ProductEntity.fromJson, | ||
246 | + (ReadContentEntity).toString(): ReadContentEntity.fromJson, | ||
247 | + (UserEntity).toString(): UserEntity.fromJson, | ||
248 | + }; | ||
249 | + | ||
250 | + bool containsKey(String type) { | ||
251 | + return convertFuncMap.containsKey(type); | ||
252 | + } | ||
253 | + | ||
254 | + JsonConvertFunction? operator [](String key) { | ||
255 | + return convertFuncMap[key]; | ||
256 | + } | ||
257 | +} | ||
170 | \ No newline at end of file | 258 | \ No newline at end of file |
lib/generated/json/base/json_field.dart
@@ -4,10 +4,14 @@ | @@ -4,10 +4,14 @@ | ||
4 | 4 | ||
5 | // This file is automatically generated. DO NOT EDIT, all your changes would be lost. | 5 | // This file is automatically generated. DO NOT EDIT, all your changes would be lost. |
6 | 6 | ||
7 | -class JsonSerializable{ | ||
8 | - const JsonSerializable(); | 7 | +import 'package:meta/meta_meta.dart'; |
8 | + | ||
9 | +@Target({TargetKind.classType}) | ||
10 | +class JsonSerializable { | ||
11 | + const JsonSerializable(); | ||
9 | } | 12 | } |
10 | 13 | ||
14 | +@Target({TargetKind.field}) | ||
11 | class JSONField { | 15 | class JSONField { |
12 | //Specify the parse field name | 16 | //Specify the parse field name |
13 | final String? name; | 17 | final String? name; |
@@ -18,8 +22,11 @@ class JSONField { | @@ -18,8 +22,11 @@ class JSONField { | ||
18 | //Whether to participate in fromMap | 22 | //Whether to participate in fromMap |
19 | final bool? deserialize; | 23 | final bool? deserialize; |
20 | 24 | ||
25 | + //Whether to participate in copyWith | ||
26 | + final bool? copyWith; | ||
27 | + | ||
21 | //Enumeration or not | 28 | //Enumeration or not |
22 | final bool? isEnum; | 29 | final bool? isEnum; |
23 | 30 | ||
24 | - const JSONField({this.name, this.serialize, this.deserialize, this.isEnum}); | 31 | + const JSONField({this.name, this.serialize, this.deserialize, this.isEnum, this.copyWith}); |
25 | } | 32 | } |
lib/generated/json/course_entity.g.dart
@@ -2,116 +2,181 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | @@ -2,116 +2,181 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | import 'package:wow_english/models/course_entity.dart'; | 2 | import 'package:wow_english/models/course_entity.dart'; |
3 | 3 | ||
4 | CourseEntity $CourseEntityFromJson(Map<String, dynamic> json) { | 4 | CourseEntity $CourseEntityFromJson(Map<String, dynamic> json) { |
5 | - final CourseEntity courseEntity = CourseEntity(); | ||
6 | - final List<CourseCourseLessons>? courseLessons = jsonConvert.convertListNotNull<CourseCourseLessons>(json['courseLessons']); | ||
7 | - if (courseLessons != null) { | ||
8 | - courseEntity.courseLessons = courseLessons; | ||
9 | - } | ||
10 | - final int? nowCourseLesson = jsonConvert.convert<int>(json['nowCourseLesson']); | ||
11 | - if (nowCourseLesson != null) { | ||
12 | - courseEntity.nowCourseLesson = nowCourseLesson; | ||
13 | - } | ||
14 | - final int? nowCourseModuleId = jsonConvert.convert<int>(json['nowCourseModuleId']); | ||
15 | - if (nowCourseModuleId != null) { | ||
16 | - courseEntity.nowCourseModuleId = nowCourseModuleId; | ||
17 | - } | ||
18 | - final String? nowCourseModuleName = jsonConvert.convert<String>(json['nowCourseModuleName']); | ||
19 | - if (nowCourseModuleName != null) { | ||
20 | - courseEntity.nowCourseModuleName = nowCourseModuleName; | ||
21 | - } | ||
22 | - final int? totalCourseLesson = jsonConvert.convert<int>(json['totalCourseLesson']); | ||
23 | - if (totalCourseLesson != null) { | ||
24 | - courseEntity.totalCourseLesson = totalCourseLesson; | ||
25 | - } | ||
26 | - final String? courseModuleThemeColor = jsonConvert.convert<String>(json['courseModuleThemeColor']); | ||
27 | - if (courseModuleThemeColor != null) { | ||
28 | - courseEntity.courseModuleThemeColor = courseModuleThemeColor; | ||
29 | - } | ||
30 | - final String? courseModuleCode = jsonConvert.convert<String>(json['courseModuleCode']); | ||
31 | - if (courseModuleCode != null) { | ||
32 | - courseEntity.courseModuleCode = courseModuleCode; | ||
33 | - } | ||
34 | - return courseEntity; | 5 | + final CourseEntity courseEntity = CourseEntity(); |
6 | + final List< | ||
7 | + CourseCourseLessons>? courseLessons = (json['courseLessons'] as List< | ||
8 | + dynamic>?) | ||
9 | + ?.map( | ||
10 | + (e) => | ||
11 | + jsonConvert.convert<CourseCourseLessons>(e) as CourseCourseLessons) | ||
12 | + .toList(); | ||
13 | + if (courseLessons != null) { | ||
14 | + courseEntity.courseLessons = courseLessons; | ||
15 | + } | ||
16 | + final int? nowCourseLesson = jsonConvert.convert<int>( | ||
17 | + json['nowCourseLesson']); | ||
18 | + if (nowCourseLesson != null) { | ||
19 | + courseEntity.nowCourseLesson = nowCourseLesson; | ||
20 | + } | ||
21 | + final int? nowCourseModuleId = jsonConvert.convert<int>( | ||
22 | + json['nowCourseModuleId']); | ||
23 | + if (nowCourseModuleId != null) { | ||
24 | + courseEntity.nowCourseModuleId = nowCourseModuleId; | ||
25 | + } | ||
26 | + final String? nowCourseModuleName = jsonConvert.convert<String>( | ||
27 | + json['nowCourseModuleName']); | ||
28 | + if (nowCourseModuleName != null) { | ||
29 | + courseEntity.nowCourseModuleName = nowCourseModuleName; | ||
30 | + } | ||
31 | + final int? totalCourseLesson = jsonConvert.convert<int>( | ||
32 | + json['totalCourseLesson']); | ||
33 | + if (totalCourseLesson != null) { | ||
34 | + courseEntity.totalCourseLesson = totalCourseLesson; | ||
35 | + } | ||
36 | + final String? courseModuleThemeColor = jsonConvert.convert<String>( | ||
37 | + json['courseModuleThemeColor']); | ||
38 | + if (courseModuleThemeColor != null) { | ||
39 | + courseEntity.courseModuleThemeColor = courseModuleThemeColor; | ||
40 | + } | ||
41 | + final String? courseModuleCode = jsonConvert.convert<String>( | ||
42 | + json['courseModuleCode']); | ||
43 | + if (courseModuleCode != null) { | ||
44 | + courseEntity.courseModuleCode = courseModuleCode; | ||
45 | + } | ||
46 | + return courseEntity; | ||
35 | } | 47 | } |
36 | 48 | ||
37 | Map<String, dynamic> $CourseEntityToJson(CourseEntity entity) { | 49 | Map<String, dynamic> $CourseEntityToJson(CourseEntity entity) { |
38 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
39 | - data['courseLessons'] = entity.courseLessons?.map((v) => v.toJson()).toList(); | ||
40 | - data['nowCourseLesson'] = entity.nowCourseLesson; | ||
41 | - data['nowCourseModuleId'] = entity.nowCourseModuleId; | ||
42 | - data['nowCourseModuleName'] = entity.nowCourseModuleName; | ||
43 | - data['totalCourseLesson'] = entity.totalCourseLesson; | ||
44 | - data['courseModuleThemeColor'] = entity.courseModuleThemeColor; | ||
45 | - data['courseModuleCode'] = entity.courseModuleCode; | ||
46 | - return data; | 50 | + final Map<String, dynamic> data = <String, dynamic>{}; |
51 | + data['courseLessons'] = entity.courseLessons?.map((v) => v.toJson()).toList(); | ||
52 | + data['nowCourseLesson'] = entity.nowCourseLesson; | ||
53 | + data['nowCourseModuleId'] = entity.nowCourseModuleId; | ||
54 | + data['nowCourseModuleName'] = entity.nowCourseModuleName; | ||
55 | + data['totalCourseLesson'] = entity.totalCourseLesson; | ||
56 | + data['courseModuleThemeColor'] = entity.courseModuleThemeColor; | ||
57 | + data['courseModuleCode'] = entity.courseModuleCode; | ||
58 | + return data; | ||
59 | +} | ||
60 | + | ||
61 | +extension CourseEntityExtension on CourseEntity { | ||
62 | + CourseEntity copyWith({ | ||
63 | + List<CourseCourseLessons>? courseLessons, | ||
64 | + int? nowCourseLesson, | ||
65 | + int? nowCourseModuleId, | ||
66 | + String? nowCourseModuleName, | ||
67 | + int? totalCourseLesson, | ||
68 | + String? courseModuleThemeColor, | ||
69 | + String? courseModuleCode, | ||
70 | + }) { | ||
71 | + return CourseEntity() | ||
72 | + ..courseLessons = courseLessons ?? this.courseLessons | ||
73 | + ..nowCourseLesson = nowCourseLesson ?? this.nowCourseLesson | ||
74 | + ..nowCourseModuleId = nowCourseModuleId ?? this.nowCourseModuleId | ||
75 | + ..nowCourseModuleName = nowCourseModuleName ?? this.nowCourseModuleName | ||
76 | + ..totalCourseLesson = totalCourseLesson ?? this.totalCourseLesson | ||
77 | + ..courseModuleThemeColor = courseModuleThemeColor ?? | ||
78 | + this.courseModuleThemeColor | ||
79 | + ..courseModuleCode = courseModuleCode ?? this.courseModuleCode; | ||
80 | + } | ||
47 | } | 81 | } |
48 | 82 | ||
49 | CourseCourseLessons $CourseCourseLessonsFromJson(Map<String, dynamic> json) { | 83 | CourseCourseLessons $CourseCourseLessonsFromJson(Map<String, dynamic> json) { |
50 | - final CourseCourseLessons courseCourseLessons = CourseCourseLessons(); | ||
51 | - final int? courseModuleId = jsonConvert.convert<int>(json['courseModuleId']); | ||
52 | - if (courseModuleId != null) { | ||
53 | - courseCourseLessons.courseModuleId = courseModuleId; | ||
54 | - } | ||
55 | - final int? courseType = jsonConvert.convert<int>(json['courseType']); | ||
56 | - if (courseType != null) { | ||
57 | - courseCourseLessons.courseType = courseType; | ||
58 | - } | ||
59 | - final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
60 | - if (coverUrl != null) { | ||
61 | - courseCourseLessons.coverUrl = coverUrl; | ||
62 | - } | ||
63 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
64 | - if (createTime != null) { | ||
65 | - courseCourseLessons.createTime = createTime; | ||
66 | - } | ||
67 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
68 | - if (deleted != null) { | ||
69 | - courseCourseLessons.deleted = deleted; | ||
70 | - } | ||
71 | - final String? des = jsonConvert.convert<String>(json['des']); | ||
72 | - if (des != null) { | ||
73 | - courseCourseLessons.des = des; | ||
74 | - } | ||
75 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
76 | - if (id != null) { | ||
77 | - courseCourseLessons.id = id; | ||
78 | - } | ||
79 | - final bool? lock = jsonConvert.convert<bool>(json['lock']); | ||
80 | - if (lock != null) { | ||
81 | - courseCourseLessons.lock = lock; | ||
82 | - } | ||
83 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
84 | - if (modifyTime != null) { | ||
85 | - courseCourseLessons.modifyTime = modifyTime; | ||
86 | - } | ||
87 | - final String? name = jsonConvert.convert<String>(json['name']); | ||
88 | - if (name != null) { | ||
89 | - courseCourseLessons.name = name; | ||
90 | - } | ||
91 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
92 | - if (sortOrder != null) { | ||
93 | - courseCourseLessons.sortOrder = sortOrder; | ||
94 | - } | ||
95 | - final int? status = jsonConvert.convert<int>(json['status']); | ||
96 | - if (status != null) { | ||
97 | - courseCourseLessons.status = status; | ||
98 | - } | ||
99 | - return courseCourseLessons; | 84 | + final CourseCourseLessons courseCourseLessons = CourseCourseLessons(); |
85 | + final int? courseModuleId = jsonConvert.convert<int>(json['courseModuleId']); | ||
86 | + if (courseModuleId != null) { | ||
87 | + courseCourseLessons.courseModuleId = courseModuleId; | ||
88 | + } | ||
89 | + final int? courseType = jsonConvert.convert<int>(json['courseType']); | ||
90 | + if (courseType != null) { | ||
91 | + courseCourseLessons.courseType = courseType; | ||
92 | + } | ||
93 | + final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
94 | + if (coverUrl != null) { | ||
95 | + courseCourseLessons.coverUrl = coverUrl; | ||
96 | + } | ||
97 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
98 | + if (createTime != null) { | ||
99 | + courseCourseLessons.createTime = createTime; | ||
100 | + } | ||
101 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
102 | + if (deleted != null) { | ||
103 | + courseCourseLessons.deleted = deleted; | ||
104 | + } | ||
105 | + final String? des = jsonConvert.convert<String>(json['des']); | ||
106 | + if (des != null) { | ||
107 | + courseCourseLessons.des = des; | ||
108 | + } | ||
109 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
110 | + if (id != null) { | ||
111 | + courseCourseLessons.id = id; | ||
112 | + } | ||
113 | + final bool? lock = jsonConvert.convert<bool>(json['lock']); | ||
114 | + if (lock != null) { | ||
115 | + courseCourseLessons.lock = lock; | ||
116 | + } | ||
117 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
118 | + if (modifyTime != null) { | ||
119 | + courseCourseLessons.modifyTime = modifyTime; | ||
120 | + } | ||
121 | + final String? name = jsonConvert.convert<String>(json['name']); | ||
122 | + if (name != null) { | ||
123 | + courseCourseLessons.name = name; | ||
124 | + } | ||
125 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
126 | + if (sortOrder != null) { | ||
127 | + courseCourseLessons.sortOrder = sortOrder; | ||
128 | + } | ||
129 | + final int? status = jsonConvert.convert<int>(json['status']); | ||
130 | + if (status != null) { | ||
131 | + courseCourseLessons.status = status; | ||
132 | + } | ||
133 | + return courseCourseLessons; | ||
100 | } | 134 | } |
101 | 135 | ||
102 | Map<String, dynamic> $CourseCourseLessonsToJson(CourseCourseLessons entity) { | 136 | Map<String, dynamic> $CourseCourseLessonsToJson(CourseCourseLessons entity) { |
103 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
104 | - data['courseModuleId'] = entity.courseModuleId; | ||
105 | - data['courseType'] = entity.courseType; | ||
106 | - data['coverUrl'] = entity.coverUrl; | ||
107 | - data['createTime'] = entity.createTime; | ||
108 | - data['deleted'] = entity.deleted; | ||
109 | - data['des'] = entity.des; | ||
110 | - data['id'] = entity.id; | ||
111 | - data['lock'] = entity.lock; | ||
112 | - data['modifyTime'] = entity.modifyTime; | ||
113 | - data['name'] = entity.name; | ||
114 | - data['sortOrder'] = entity.sortOrder; | ||
115 | - data['status'] = entity.status; | ||
116 | - return data; | 137 | + final Map<String, dynamic> data = <String, dynamic>{}; |
138 | + data['courseModuleId'] = entity.courseModuleId; | ||
139 | + data['courseType'] = entity.courseType; | ||
140 | + data['coverUrl'] = entity.coverUrl; | ||
141 | + data['createTime'] = entity.createTime; | ||
142 | + data['deleted'] = entity.deleted; | ||
143 | + data['des'] = entity.des; | ||
144 | + data['id'] = entity.id; | ||
145 | + data['lock'] = entity.lock; | ||
146 | + data['modifyTime'] = entity.modifyTime; | ||
147 | + data['name'] = entity.name; | ||
148 | + data['sortOrder'] = entity.sortOrder; | ||
149 | + data['status'] = entity.status; | ||
150 | + return data; | ||
151 | +} | ||
152 | + | ||
153 | +extension CourseCourseLessonsExtension on CourseCourseLessons { | ||
154 | + CourseCourseLessons copyWith({ | ||
155 | + int? courseModuleId, | ||
156 | + int? courseType, | ||
157 | + String? coverUrl, | ||
158 | + String? createTime, | ||
159 | + String? deleted, | ||
160 | + String? des, | ||
161 | + String? id, | ||
162 | + bool? lock, | ||
163 | + String? modifyTime, | ||
164 | + String? name, | ||
165 | + int? sortOrder, | ||
166 | + int? status, | ||
167 | + }) { | ||
168 | + return CourseCourseLessons() | ||
169 | + ..courseModuleId = courseModuleId ?? this.courseModuleId | ||
170 | + ..courseType = courseType ?? this.courseType | ||
171 | + ..coverUrl = coverUrl ?? this.coverUrl | ||
172 | + ..createTime = createTime ?? this.createTime | ||
173 | + ..deleted = deleted ?? this.deleted | ||
174 | + ..des = des ?? this.des | ||
175 | + ..id = id ?? this.id | ||
176 | + ..lock = lock ?? this.lock | ||
177 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
178 | + ..name = name ?? this.name | ||
179 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
180 | + ..status = status ?? this.status; | ||
181 | + } | ||
117 | } | 182 | } |
118 | \ No newline at end of file | 183 | \ No newline at end of file |
lib/generated/json/course_module_entity.g.dart
@@ -2,86 +2,126 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | @@ -2,86 +2,126 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | import 'package:wow_english/models/course_module_entity.dart'; | 2 | import 'package:wow_english/models/course_module_entity.dart'; |
3 | 3 | ||
4 | CourseModuleEntity $CourseModuleEntityFromJson(Map<String, dynamic> json) { | 4 | CourseModuleEntity $CourseModuleEntityFromJson(Map<String, dynamic> json) { |
5 | - final CourseModuleEntity courseModuleEntity = CourseModuleEntity(); | ||
6 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
7 | - if (id != null) { | ||
8 | - courseModuleEntity.id = id; | ||
9 | - } | ||
10 | - final String? code = jsonConvert.convert<String>(json['code']); | ||
11 | - if (code != null) { | ||
12 | - courseModuleEntity.code = code; | ||
13 | - } | ||
14 | - final int? courseModuleThemeId = jsonConvert.convert<int>(json['courseModuleThemeId']); | ||
15 | - if (courseModuleThemeId != null) { | ||
16 | - courseModuleEntity.courseModuleThemeId = courseModuleThemeId; | ||
17 | - } | ||
18 | - final int? courseTotal = jsonConvert.convert<int>(json['courseTotal']); | ||
19 | - if (courseTotal != null) { | ||
20 | - courseModuleEntity.courseTotal = courseTotal; | ||
21 | - } | ||
22 | - final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
23 | - if (coverUrl != null) { | ||
24 | - courseModuleEntity.coverUrl = coverUrl; | ||
25 | - } | ||
26 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
27 | - if (createTime != null) { | ||
28 | - courseModuleEntity.createTime = createTime; | ||
29 | - } | ||
30 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
31 | - if (deleted != null) { | ||
32 | - courseModuleEntity.deleted = deleted; | ||
33 | - } | ||
34 | - final String? des = jsonConvert.convert<String>(json['des']); | ||
35 | - if (des != null) { | ||
36 | - courseModuleEntity.des = des; | ||
37 | - } | ||
38 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
39 | - if (modifyTime != null) { | ||
40 | - courseModuleEntity.modifyTime = modifyTime; | ||
41 | - } | ||
42 | - final String? name = jsonConvert.convert<String>(json['name']); | ||
43 | - if (name != null) { | ||
44 | - courseModuleEntity.name = name; | ||
45 | - } | ||
46 | - final int? opening = jsonConvert.convert<int>(json['opening']); | ||
47 | - if (opening != null) { | ||
48 | - courseModuleEntity.opening = opening; | ||
49 | - } | ||
50 | - final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
51 | - if (picUrl != null) { | ||
52 | - courseModuleEntity.picUrl = picUrl; | ||
53 | - } | ||
54 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
55 | - if (sortOrder != null) { | ||
56 | - courseModuleEntity.sortOrder = sortOrder; | ||
57 | - } | ||
58 | - final int? status = jsonConvert.convert<int>(json['status']); | ||
59 | - if (status != null) { | ||
60 | - courseModuleEntity.status = status; | ||
61 | - } | ||
62 | - final String? courseModuleThemeColor = jsonConvert.convert<String>(json['courseModuleThemeColor']); | ||
63 | - if (courseModuleThemeColor != null) { | ||
64 | - courseModuleEntity.courseModuleThemeColor = courseModuleThemeColor; | ||
65 | - } | ||
66 | - return courseModuleEntity; | 5 | + final CourseModuleEntity courseModuleEntity = CourseModuleEntity(); |
6 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
7 | + if (id != null) { | ||
8 | + courseModuleEntity.id = id; | ||
9 | + } | ||
10 | + final String? code = jsonConvert.convert<String>(json['code']); | ||
11 | + if (code != null) { | ||
12 | + courseModuleEntity.code = code; | ||
13 | + } | ||
14 | + final int? courseModuleThemeId = jsonConvert.convert<int>( | ||
15 | + json['courseModuleThemeId']); | ||
16 | + if (courseModuleThemeId != null) { | ||
17 | + courseModuleEntity.courseModuleThemeId = courseModuleThemeId; | ||
18 | + } | ||
19 | + final int? courseTotal = jsonConvert.convert<int>(json['courseTotal']); | ||
20 | + if (courseTotal != null) { | ||
21 | + courseModuleEntity.courseTotal = courseTotal; | ||
22 | + } | ||
23 | + final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
24 | + if (coverUrl != null) { | ||
25 | + courseModuleEntity.coverUrl = coverUrl; | ||
26 | + } | ||
27 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
28 | + if (createTime != null) { | ||
29 | + courseModuleEntity.createTime = createTime; | ||
30 | + } | ||
31 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
32 | + if (deleted != null) { | ||
33 | + courseModuleEntity.deleted = deleted; | ||
34 | + } | ||
35 | + final String? des = jsonConvert.convert<String>(json['des']); | ||
36 | + if (des != null) { | ||
37 | + courseModuleEntity.des = des; | ||
38 | + } | ||
39 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
40 | + if (modifyTime != null) { | ||
41 | + courseModuleEntity.modifyTime = modifyTime; | ||
42 | + } | ||
43 | + final String? name = jsonConvert.convert<String>(json['name']); | ||
44 | + if (name != null) { | ||
45 | + courseModuleEntity.name = name; | ||
46 | + } | ||
47 | + final int? opening = jsonConvert.convert<int>(json['opening']); | ||
48 | + if (opening != null) { | ||
49 | + courseModuleEntity.opening = opening; | ||
50 | + } | ||
51 | + final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
52 | + if (picUrl != null) { | ||
53 | + courseModuleEntity.picUrl = picUrl; | ||
54 | + } | ||
55 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
56 | + if (sortOrder != null) { | ||
57 | + courseModuleEntity.sortOrder = sortOrder; | ||
58 | + } | ||
59 | + final int? status = jsonConvert.convert<int>(json['status']); | ||
60 | + if (status != null) { | ||
61 | + courseModuleEntity.status = status; | ||
62 | + } | ||
63 | + final String? courseModuleThemeColor = jsonConvert.convert<String>( | ||
64 | + json['courseModuleThemeColor']); | ||
65 | + if (courseModuleThemeColor != null) { | ||
66 | + courseModuleEntity.courseModuleThemeColor = courseModuleThemeColor; | ||
67 | + } | ||
68 | + return courseModuleEntity; | ||
67 | } | 69 | } |
68 | 70 | ||
69 | Map<String, dynamic> $CourseModuleEntityToJson(CourseModuleEntity entity) { | 71 | Map<String, dynamic> $CourseModuleEntityToJson(CourseModuleEntity entity) { |
70 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
71 | - data['id'] = entity.id; | ||
72 | - data['code'] = entity.code; | ||
73 | - data['courseModuleThemeId'] = entity.courseModuleThemeId; | ||
74 | - data['courseTotal'] = entity.courseTotal; | ||
75 | - data['coverUrl'] = entity.coverUrl; | ||
76 | - data['createTime'] = entity.createTime; | ||
77 | - data['deleted'] = entity.deleted; | ||
78 | - data['des'] = entity.des; | ||
79 | - data['modifyTime'] = entity.modifyTime; | ||
80 | - data['name'] = entity.name; | ||
81 | - data['opening'] = entity.opening; | ||
82 | - data['picUrl'] = entity.picUrl; | ||
83 | - data['sortOrder'] = entity.sortOrder; | ||
84 | - data['status'] = entity.status; | ||
85 | - data['courseModuleThemeColor'] = entity.courseModuleThemeColor; | ||
86 | - return data; | 72 | + final Map<String, dynamic> data = <String, dynamic>{}; |
73 | + data['id'] = entity.id; | ||
74 | + data['code'] = entity.code; | ||
75 | + data['courseModuleThemeId'] = entity.courseModuleThemeId; | ||
76 | + data['courseTotal'] = entity.courseTotal; | ||
77 | + data['coverUrl'] = entity.coverUrl; | ||
78 | + data['createTime'] = entity.createTime; | ||
79 | + data['deleted'] = entity.deleted; | ||
80 | + data['des'] = entity.des; | ||
81 | + data['modifyTime'] = entity.modifyTime; | ||
82 | + data['name'] = entity.name; | ||
83 | + data['opening'] = entity.opening; | ||
84 | + data['picUrl'] = entity.picUrl; | ||
85 | + data['sortOrder'] = entity.sortOrder; | ||
86 | + data['status'] = entity.status; | ||
87 | + data['courseModuleThemeColor'] = entity.courseModuleThemeColor; | ||
88 | + return data; | ||
87 | } | 89 | } |
90 | + | ||
91 | +extension CourseModuleEntityExtension on CourseModuleEntity { | ||
92 | + CourseModuleEntity copyWith({ | ||
93 | + String? id, | ||
94 | + String? code, | ||
95 | + int? courseModuleThemeId, | ||
96 | + int? courseTotal, | ||
97 | + String? coverUrl, | ||
98 | + String? createTime, | ||
99 | + String? deleted, | ||
100 | + String? des, | ||
101 | + String? modifyTime, | ||
102 | + String? name, | ||
103 | + int? opening, | ||
104 | + String? picUrl, | ||
105 | + int? sortOrder, | ||
106 | + int? status, | ||
107 | + String? courseModuleThemeColor, | ||
108 | + }) { | ||
109 | + return CourseModuleEntity() | ||
110 | + ..id = id ?? this.id | ||
111 | + ..code = code ?? this.code | ||
112 | + ..courseModuleThemeId = courseModuleThemeId ?? this.courseModuleThemeId | ||
113 | + ..courseTotal = courseTotal ?? this.courseTotal | ||
114 | + ..coverUrl = coverUrl ?? this.coverUrl | ||
115 | + ..createTime = createTime ?? this.createTime | ||
116 | + ..deleted = deleted ?? this.deleted | ||
117 | + ..des = des ?? this.des | ||
118 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
119 | + ..name = name ?? this.name | ||
120 | + ..opening = opening ?? this.opening | ||
121 | + ..picUrl = picUrl ?? this.picUrl | ||
122 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
123 | + ..status = status ?? this.status | ||
124 | + ..courseModuleThemeColor = courseModuleThemeColor ?? | ||
125 | + this.courseModuleThemeColor; | ||
126 | + } | ||
127 | +} | ||
88 | \ No newline at end of file | 128 | \ No newline at end of file |
lib/generated/json/course_process_entity.g.dart
@@ -2,286 +2,435 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | @@ -2,286 +2,435 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | import 'package:wow_english/models/course_process_entity.dart'; | 2 | import 'package:wow_english/models/course_process_entity.dart'; |
3 | 3 | ||
4 | CourseProcessEntity $CourseProcessEntityFromJson(Map<String, dynamic> json) { | 4 | CourseProcessEntity $CourseProcessEntityFromJson(Map<String, dynamic> json) { |
5 | - final CourseProcessEntity courseProcessEntity = CourseProcessEntity(); | ||
6 | - final int? currentStep = jsonConvert.convert<int>(json['currentStep']); | ||
7 | - if (currentStep != null) { | ||
8 | - courseProcessEntity.currentStep = currentStep; | ||
9 | - } | ||
10 | - final int? currentTime = jsonConvert.convert<int>(json['currentTime']); | ||
11 | - if (currentTime != null) { | ||
12 | - courseProcessEntity.currentTime = currentTime; | ||
13 | - } | ||
14 | - final List<CourseProcessReadings>? readings = jsonConvert.convertListNotNull<CourseProcessReadings>(json['readings']); | ||
15 | - if (readings != null) { | ||
16 | - courseProcessEntity.readings = readings; | ||
17 | - } | ||
18 | - final List<CourseProcessTopics>? topics = jsonConvert.convertListNotNull<CourseProcessTopics>(json['topics']); | ||
19 | - if (topics != null) { | ||
20 | - courseProcessEntity.topics = topics; | ||
21 | - } | ||
22 | - final CourseProcessVideos? videos = jsonConvert.convert<CourseProcessVideos>(json['videos']); | ||
23 | - if (videos != null) { | ||
24 | - courseProcessEntity.videos = videos; | ||
25 | - } | ||
26 | - return courseProcessEntity; | 5 | + final CourseProcessEntity courseProcessEntity = CourseProcessEntity(); |
6 | + final int? currentStep = jsonConvert.convert<int>(json['currentStep']); | ||
7 | + if (currentStep != null) { | ||
8 | + courseProcessEntity.currentStep = currentStep; | ||
9 | + } | ||
10 | + final int? currentTime = jsonConvert.convert<int>(json['currentTime']); | ||
11 | + if (currentTime != null) { | ||
12 | + courseProcessEntity.currentTime = currentTime; | ||
13 | + } | ||
14 | + final List<CourseProcessReadings>? readings = (json['readings'] as List< | ||
15 | + dynamic>?) | ||
16 | + ?.map( | ||
17 | + (e) => | ||
18 | + jsonConvert.convert<CourseProcessReadings>(e) as CourseProcessReadings) | ||
19 | + .toList(); | ||
20 | + if (readings != null) { | ||
21 | + courseProcessEntity.readings = readings; | ||
22 | + } | ||
23 | + final List<CourseProcessTopics>? topics = (json['topics'] as List<dynamic>?) | ||
24 | + ?.map( | ||
25 | + (e) => | ||
26 | + jsonConvert.convert<CourseProcessTopics>(e) as CourseProcessTopics) | ||
27 | + .toList(); | ||
28 | + if (topics != null) { | ||
29 | + courseProcessEntity.topics = topics; | ||
30 | + } | ||
31 | + final CourseProcessVideos? videos = jsonConvert.convert<CourseProcessVideos>( | ||
32 | + json['videos']); | ||
33 | + if (videos != null) { | ||
34 | + courseProcessEntity.videos = videos; | ||
35 | + } | ||
36 | + return courseProcessEntity; | ||
27 | } | 37 | } |
28 | 38 | ||
29 | Map<String, dynamic> $CourseProcessEntityToJson(CourseProcessEntity entity) { | 39 | Map<String, dynamic> $CourseProcessEntityToJson(CourseProcessEntity entity) { |
30 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
31 | - data['currentStep'] = entity.currentStep; | ||
32 | - data['currentTime'] = entity.currentTime; | ||
33 | - data['readings'] = entity.readings?.map((v) => v.toJson()).toList(); | ||
34 | - data['topics'] = entity.topics?.map((v) => v.toJson()).toList(); | ||
35 | - data['videos'] = entity.videos?.toJson(); | ||
36 | - return data; | 40 | + final Map<String, dynamic> data = <String, dynamic>{}; |
41 | + data['currentStep'] = entity.currentStep; | ||
42 | + data['currentTime'] = entity.currentTime; | ||
43 | + data['readings'] = entity.readings?.map((v) => v.toJson()).toList(); | ||
44 | + data['topics'] = entity.topics?.map((v) => v.toJson()).toList(); | ||
45 | + data['videos'] = entity.videos?.toJson(); | ||
46 | + return data; | ||
37 | } | 47 | } |
38 | 48 | ||
39 | -CourseProcessReadings $CourseProcessReadingsFromJson(Map<String, dynamic> json) { | ||
40 | - final CourseProcessReadings courseProcessReadings = CourseProcessReadings(); | ||
41 | - final String? audioUrl = jsonConvert.convert<String>(json['audioUrl']); | ||
42 | - if (audioUrl != null) { | ||
43 | - courseProcessReadings.audioUrl = audioUrl; | ||
44 | - } | ||
45 | - final int? courseLessonId = jsonConvert.convert<int>(json['courseLessonId']); | ||
46 | - if (courseLessonId != null) { | ||
47 | - courseProcessReadings.courseLessonId = courseLessonId; | ||
48 | - } | ||
49 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
50 | - if (createTime != null) { | ||
51 | - courseProcessReadings.createTime = createTime; | ||
52 | - } | ||
53 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
54 | - if (deleted != null) { | ||
55 | - courseProcessReadings.deleted = deleted; | ||
56 | - } | ||
57 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
58 | - if (id != null) { | ||
59 | - courseProcessReadings.id = id; | ||
60 | - } | ||
61 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
62 | - if (modifyTime != null) { | ||
63 | - courseProcessReadings.modifyTime = modifyTime; | ||
64 | - } | ||
65 | - final String? padPicUrl = jsonConvert.convert<String>(json['padPicUrl']); | ||
66 | - if (padPicUrl != null) { | ||
67 | - courseProcessReadings.padPicUrl = padPicUrl; | ||
68 | - } | ||
69 | - final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
70 | - if (picUrl != null) { | ||
71 | - courseProcessReadings.picUrl = picUrl; | ||
72 | - } | ||
73 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
74 | - if (sortOrder != null) { | ||
75 | - courseProcessReadings.sortOrder = sortOrder; | ||
76 | - } | ||
77 | - final String? word = jsonConvert.convert<String>(json['word']); | ||
78 | - if (word != null) { | ||
79 | - courseProcessReadings.word = word; | ||
80 | - } | ||
81 | - final String? recordUrl = jsonConvert.convert<String>(json['recordUrl']); | ||
82 | - if (recordUrl != null) { | ||
83 | - courseProcessReadings.recordUrl = recordUrl; | ||
84 | - } | ||
85 | - final String? recordScore = jsonConvert.convert<String>(json['recordScore']); | ||
86 | - if (recordScore != null) { | ||
87 | - courseProcessReadings.recordScore = recordScore; | ||
88 | - } | ||
89 | - return courseProcessReadings; | 49 | +extension CourseProcessEntityExtension on CourseProcessEntity { |
50 | + CourseProcessEntity copyWith({ | ||
51 | + int? currentStep, | ||
52 | + int? currentTime, | ||
53 | + List<CourseProcessReadings>? readings, | ||
54 | + List<CourseProcessTopics>? topics, | ||
55 | + CourseProcessVideos? videos, | ||
56 | + }) { | ||
57 | + return CourseProcessEntity() | ||
58 | + ..currentStep = currentStep ?? this.currentStep | ||
59 | + ..currentTime = currentTime ?? this.currentTime | ||
60 | + ..readings = readings ?? this.readings | ||
61 | + ..topics = topics ?? this.topics | ||
62 | + ..videos = videos ?? this.videos; | ||
63 | + } | ||
90 | } | 64 | } |
91 | 65 | ||
92 | -Map<String, dynamic> $CourseProcessReadingsToJson(CourseProcessReadings entity) { | ||
93 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
94 | - data['audioUrl'] = entity.audioUrl; | ||
95 | - data['courseLessonId'] = entity.courseLessonId; | ||
96 | - data['createTime'] = entity.createTime; | ||
97 | - data['deleted'] = entity.deleted; | ||
98 | - data['id'] = entity.id; | ||
99 | - data['modifyTime'] = entity.modifyTime; | ||
100 | - data['padPicUrl'] = entity.padPicUrl; | ||
101 | - data['picUrl'] = entity.picUrl; | ||
102 | - data['sortOrder'] = entity.sortOrder; | ||
103 | - data['word'] = entity.word; | ||
104 | - data['recordUrl'] = entity.recordUrl; | ||
105 | - data['recordScore'] = entity.recordScore; | ||
106 | - return data; | 66 | +CourseProcessReadings $CourseProcessReadingsFromJson( |
67 | + Map<String, dynamic> json) { | ||
68 | + final CourseProcessReadings courseProcessReadings = CourseProcessReadings(); | ||
69 | + final String? audioUrl = jsonConvert.convert<String>(json['audioUrl']); | ||
70 | + if (audioUrl != null) { | ||
71 | + courseProcessReadings.audioUrl = audioUrl; | ||
72 | + } | ||
73 | + final int? courseLessonId = jsonConvert.convert<int>(json['courseLessonId']); | ||
74 | + if (courseLessonId != null) { | ||
75 | + courseProcessReadings.courseLessonId = courseLessonId; | ||
76 | + } | ||
77 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
78 | + if (createTime != null) { | ||
79 | + courseProcessReadings.createTime = createTime; | ||
80 | + } | ||
81 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
82 | + if (deleted != null) { | ||
83 | + courseProcessReadings.deleted = deleted; | ||
84 | + } | ||
85 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
86 | + if (id != null) { | ||
87 | + courseProcessReadings.id = id; | ||
88 | + } | ||
89 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
90 | + if (modifyTime != null) { | ||
91 | + courseProcessReadings.modifyTime = modifyTime; | ||
92 | + } | ||
93 | + final String? padPicUrl = jsonConvert.convert<String>(json['padPicUrl']); | ||
94 | + if (padPicUrl != null) { | ||
95 | + courseProcessReadings.padPicUrl = padPicUrl; | ||
96 | + } | ||
97 | + final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
98 | + if (picUrl != null) { | ||
99 | + courseProcessReadings.picUrl = picUrl; | ||
100 | + } | ||
101 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
102 | + if (sortOrder != null) { | ||
103 | + courseProcessReadings.sortOrder = sortOrder; | ||
104 | + } | ||
105 | + final String? word = jsonConvert.convert<String>(json['word']); | ||
106 | + if (word != null) { | ||
107 | + courseProcessReadings.word = word; | ||
108 | + } | ||
109 | + final String? recordUrl = jsonConvert.convert<String>(json['recordUrl']); | ||
110 | + if (recordUrl != null) { | ||
111 | + courseProcessReadings.recordUrl = recordUrl; | ||
112 | + } | ||
113 | + final String? recordScore = jsonConvert.convert<String>(json['recordScore']); | ||
114 | + if (recordScore != null) { | ||
115 | + courseProcessReadings.recordScore = recordScore; | ||
116 | + } | ||
117 | + return courseProcessReadings; | ||
118 | +} | ||
119 | + | ||
120 | +Map<String, dynamic> $CourseProcessReadingsToJson( | ||
121 | + CourseProcessReadings entity) { | ||
122 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
123 | + data['audioUrl'] = entity.audioUrl; | ||
124 | + data['courseLessonId'] = entity.courseLessonId; | ||
125 | + data['createTime'] = entity.createTime; | ||
126 | + data['deleted'] = entity.deleted; | ||
127 | + data['id'] = entity.id; | ||
128 | + data['modifyTime'] = entity.modifyTime; | ||
129 | + data['padPicUrl'] = entity.padPicUrl; | ||
130 | + data['picUrl'] = entity.picUrl; | ||
131 | + data['sortOrder'] = entity.sortOrder; | ||
132 | + data['word'] = entity.word; | ||
133 | + data['recordUrl'] = entity.recordUrl; | ||
134 | + data['recordScore'] = entity.recordScore; | ||
135 | + return data; | ||
136 | +} | ||
137 | + | ||
138 | +extension CourseProcessReadingsExtension on CourseProcessReadings { | ||
139 | + CourseProcessReadings copyWith({ | ||
140 | + String? audioUrl, | ||
141 | + int? courseLessonId, | ||
142 | + String? createTime, | ||
143 | + String? deleted, | ||
144 | + String? id, | ||
145 | + String? modifyTime, | ||
146 | + String? padPicUrl, | ||
147 | + String? picUrl, | ||
148 | + int? sortOrder, | ||
149 | + String? word, | ||
150 | + String? recordUrl, | ||
151 | + String? recordScore, | ||
152 | + }) { | ||
153 | + return CourseProcessReadings() | ||
154 | + ..audioUrl = audioUrl ?? this.audioUrl | ||
155 | + ..courseLessonId = courseLessonId ?? this.courseLessonId | ||
156 | + ..createTime = createTime ?? this.createTime | ||
157 | + ..deleted = deleted ?? this.deleted | ||
158 | + ..id = id ?? this.id | ||
159 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
160 | + ..padPicUrl = padPicUrl ?? this.padPicUrl | ||
161 | + ..picUrl = picUrl ?? this.picUrl | ||
162 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
163 | + ..word = word ?? this.word | ||
164 | + ..recordUrl = recordUrl ?? this.recordUrl | ||
165 | + ..recordScore = recordScore ?? this.recordScore; | ||
166 | + } | ||
107 | } | 167 | } |
108 | 168 | ||
109 | CourseProcessTopics $CourseProcessTopicsFromJson(Map<String, dynamic> json) { | 169 | CourseProcessTopics $CourseProcessTopicsFromJson(Map<String, dynamic> json) { |
110 | - final CourseProcessTopics courseProcessTopics = CourseProcessTopics(); | ||
111 | - final String? audioUrl = jsonConvert.convert<String>(json['audioUrl']); | ||
112 | - if (audioUrl != null) { | ||
113 | - courseProcessTopics.audioUrl = audioUrl; | ||
114 | - } | ||
115 | - final int? courseLessonId = jsonConvert.convert<int>(json['courseLessonId']); | ||
116 | - if (courseLessonId != null) { | ||
117 | - courseProcessTopics.courseLessonId = courseLessonId; | ||
118 | - } | ||
119 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
120 | - if (createTime != null) { | ||
121 | - courseProcessTopics.createTime = createTime; | ||
122 | - } | ||
123 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
124 | - if (deleted != null) { | ||
125 | - courseProcessTopics.deleted = deleted; | ||
126 | - } | ||
127 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
128 | - if (id != null) { | ||
129 | - courseProcessTopics.id = id; | ||
130 | - } | ||
131 | - final String? keyWord = jsonConvert.convert<String>(json['keyWord']); | ||
132 | - if (keyWord != null) { | ||
133 | - courseProcessTopics.keyWord = keyWord; | ||
134 | - } | ||
135 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
136 | - if (modifyTime != null) { | ||
137 | - courseProcessTopics.modifyTime = modifyTime; | ||
138 | - } | ||
139 | - final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
140 | - if (picUrl != null) { | ||
141 | - courseProcessTopics.picUrl = picUrl; | ||
142 | - } | ||
143 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
144 | - if (sortOrder != null) { | ||
145 | - courseProcessTopics.sortOrder = sortOrder; | ||
146 | - } | ||
147 | - final int? status = jsonConvert.convert<int>(json['status']); | ||
148 | - if (status != null) { | ||
149 | - courseProcessTopics.status = status; | ||
150 | - } | ||
151 | - final List<CourseProcessTopicsTopicAnswerList>? topicAnswerList = jsonConvert.convertListNotNull<CourseProcessTopicsTopicAnswerList>(json['topicAnswerList']); | ||
152 | - if (topicAnswerList != null) { | ||
153 | - courseProcessTopics.topicAnswerList = topicAnswerList; | ||
154 | - } | ||
155 | - final int? type = jsonConvert.convert<int>(json['type']); | ||
156 | - if (type != null) { | ||
157 | - courseProcessTopics.type = type; | ||
158 | - } | ||
159 | - final String? word = jsonConvert.convert<String>(json['word']); | ||
160 | - if (word != null) { | ||
161 | - courseProcessTopics.word = word; | ||
162 | - } | ||
163 | - return courseProcessTopics; | 170 | + final CourseProcessTopics courseProcessTopics = CourseProcessTopics(); |
171 | + final String? audioUrl = jsonConvert.convert<String>(json['audioUrl']); | ||
172 | + if (audioUrl != null) { | ||
173 | + courseProcessTopics.audioUrl = audioUrl; | ||
174 | + } | ||
175 | + final int? courseLessonId = jsonConvert.convert<int>(json['courseLessonId']); | ||
176 | + if (courseLessonId != null) { | ||
177 | + courseProcessTopics.courseLessonId = courseLessonId; | ||
178 | + } | ||
179 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
180 | + if (createTime != null) { | ||
181 | + courseProcessTopics.createTime = createTime; | ||
182 | + } | ||
183 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
184 | + if (deleted != null) { | ||
185 | + courseProcessTopics.deleted = deleted; | ||
186 | + } | ||
187 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
188 | + if (id != null) { | ||
189 | + courseProcessTopics.id = id; | ||
190 | + } | ||
191 | + final String? keyWord = jsonConvert.convert<String>(json['keyWord']); | ||
192 | + if (keyWord != null) { | ||
193 | + courseProcessTopics.keyWord = keyWord; | ||
194 | + } | ||
195 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
196 | + if (modifyTime != null) { | ||
197 | + courseProcessTopics.modifyTime = modifyTime; | ||
198 | + } | ||
199 | + final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
200 | + if (picUrl != null) { | ||
201 | + courseProcessTopics.picUrl = picUrl; | ||
202 | + } | ||
203 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
204 | + if (sortOrder != null) { | ||
205 | + courseProcessTopics.sortOrder = sortOrder; | ||
206 | + } | ||
207 | + final int? status = jsonConvert.convert<int>(json['status']); | ||
208 | + if (status != null) { | ||
209 | + courseProcessTopics.status = status; | ||
210 | + } | ||
211 | + final List< | ||
212 | + CourseProcessTopicsTopicAnswerList>? topicAnswerList = (json['topicAnswerList'] as List< | ||
213 | + dynamic>?)?.map( | ||
214 | + (e) => | ||
215 | + jsonConvert.convert<CourseProcessTopicsTopicAnswerList>( | ||
216 | + e) as CourseProcessTopicsTopicAnswerList).toList(); | ||
217 | + if (topicAnswerList != null) { | ||
218 | + courseProcessTopics.topicAnswerList = topicAnswerList; | ||
219 | + } | ||
220 | + final int? type = jsonConvert.convert<int>(json['type']); | ||
221 | + if (type != null) { | ||
222 | + courseProcessTopics.type = type; | ||
223 | + } | ||
224 | + final String? word = jsonConvert.convert<String>(json['word']); | ||
225 | + if (word != null) { | ||
226 | + courseProcessTopics.word = word; | ||
227 | + } | ||
228 | + return courseProcessTopics; | ||
164 | } | 229 | } |
165 | 230 | ||
166 | Map<String, dynamic> $CourseProcessTopicsToJson(CourseProcessTopics entity) { | 231 | Map<String, dynamic> $CourseProcessTopicsToJson(CourseProcessTopics entity) { |
167 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
168 | - data['audioUrl'] = entity.audioUrl; | ||
169 | - data['courseLessonId'] = entity.courseLessonId; | ||
170 | - data['createTime'] = entity.createTime; | ||
171 | - data['deleted'] = entity.deleted; | ||
172 | - data['id'] = entity.id; | ||
173 | - data['keyWord'] = entity.keyWord; | ||
174 | - data['modifyTime'] = entity.modifyTime; | ||
175 | - data['picUrl'] = entity.picUrl; | ||
176 | - data['sortOrder'] = entity.sortOrder; | ||
177 | - data['status'] = entity.status; | ||
178 | - data['topicAnswerList'] = entity.topicAnswerList?.map((v) => v.toJson()).toList(); | ||
179 | - data['type'] = entity.type; | ||
180 | - data['word'] = entity.word; | ||
181 | - return data; | 232 | + final Map<String, dynamic> data = <String, dynamic>{}; |
233 | + data['audioUrl'] = entity.audioUrl; | ||
234 | + data['courseLessonId'] = entity.courseLessonId; | ||
235 | + data['createTime'] = entity.createTime; | ||
236 | + data['deleted'] = entity.deleted; | ||
237 | + data['id'] = entity.id; | ||
238 | + data['keyWord'] = entity.keyWord; | ||
239 | + data['modifyTime'] = entity.modifyTime; | ||
240 | + data['picUrl'] = entity.picUrl; | ||
241 | + data['sortOrder'] = entity.sortOrder; | ||
242 | + data['status'] = entity.status; | ||
243 | + data['topicAnswerList'] = | ||
244 | + entity.topicAnswerList?.map((v) => v.toJson()).toList(); | ||
245 | + data['type'] = entity.type; | ||
246 | + data['word'] = entity.word; | ||
247 | + return data; | ||
248 | +} | ||
249 | + | ||
250 | +extension CourseProcessTopicsExtension on CourseProcessTopics { | ||
251 | + CourseProcessTopics copyWith({ | ||
252 | + String? audioUrl, | ||
253 | + int? courseLessonId, | ||
254 | + String? createTime, | ||
255 | + String? deleted, | ||
256 | + String? id, | ||
257 | + String? keyWord, | ||
258 | + String? modifyTime, | ||
259 | + String? picUrl, | ||
260 | + int? sortOrder, | ||
261 | + int? status, | ||
262 | + List<CourseProcessTopicsTopicAnswerList>? topicAnswerList, | ||
263 | + int? type, | ||
264 | + String? word, | ||
265 | + }) { | ||
266 | + return CourseProcessTopics() | ||
267 | + ..audioUrl = audioUrl ?? this.audioUrl | ||
268 | + ..courseLessonId = courseLessonId ?? this.courseLessonId | ||
269 | + ..createTime = createTime ?? this.createTime | ||
270 | + ..deleted = deleted ?? this.deleted | ||
271 | + ..id = id ?? this.id | ||
272 | + ..keyWord = keyWord ?? this.keyWord | ||
273 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
274 | + ..picUrl = picUrl ?? this.picUrl | ||
275 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
276 | + ..status = status ?? this.status | ||
277 | + ..topicAnswerList = topicAnswerList ?? this.topicAnswerList | ||
278 | + ..type = type ?? this.type | ||
279 | + ..word = word ?? this.word; | ||
280 | + } | ||
281 | +} | ||
282 | + | ||
283 | +CourseProcessTopicsTopicAnswerList $CourseProcessTopicsTopicAnswerListFromJson( | ||
284 | + Map<String, dynamic> json) { | ||
285 | + final CourseProcessTopicsTopicAnswerList courseProcessTopicsTopicAnswerList = CourseProcessTopicsTopicAnswerList(); | ||
286 | + final int? correct = jsonConvert.convert<int>(json['correct']); | ||
287 | + if (correct != null) { | ||
288 | + courseProcessTopicsTopicAnswerList.correct = correct; | ||
289 | + } | ||
290 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
291 | + if (createTime != null) { | ||
292 | + courseProcessTopicsTopicAnswerList.createTime = createTime; | ||
293 | + } | ||
294 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
295 | + if (deleted != null) { | ||
296 | + courseProcessTopicsTopicAnswerList.deleted = deleted; | ||
297 | + } | ||
298 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
299 | + if (id != null) { | ||
300 | + courseProcessTopicsTopicAnswerList.id = id; | ||
301 | + } | ||
302 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
303 | + if (modifyTime != null) { | ||
304 | + courseProcessTopicsTopicAnswerList.modifyTime = modifyTime; | ||
305 | + } | ||
306 | + final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
307 | + if (picUrl != null) { | ||
308 | + courseProcessTopicsTopicAnswerList.picUrl = picUrl; | ||
309 | + } | ||
310 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
311 | + if (sortOrder != null) { | ||
312 | + courseProcessTopicsTopicAnswerList.sortOrder = sortOrder; | ||
313 | + } | ||
314 | + final int? topicId = jsonConvert.convert<int>(json['topicId']); | ||
315 | + if (topicId != null) { | ||
316 | + courseProcessTopicsTopicAnswerList.topicId = topicId; | ||
317 | + } | ||
318 | + final String? word = jsonConvert.convert<String>(json['word']); | ||
319 | + if (word != null) { | ||
320 | + courseProcessTopicsTopicAnswerList.word = word; | ||
321 | + } | ||
322 | + return courseProcessTopicsTopicAnswerList; | ||
182 | } | 323 | } |
183 | 324 | ||
184 | -CourseProcessTopicsTopicAnswerList $CourseProcessTopicsTopicAnswerListFromJson(Map<String, dynamic> json) { | ||
185 | - final CourseProcessTopicsTopicAnswerList courseProcessTopicsTopicAnswerList = CourseProcessTopicsTopicAnswerList(); | ||
186 | - final int? correct = jsonConvert.convert<int>(json['correct']); | ||
187 | - if (correct != null) { | ||
188 | - courseProcessTopicsTopicAnswerList.correct = correct; | ||
189 | - } | ||
190 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
191 | - if (createTime != null) { | ||
192 | - courseProcessTopicsTopicAnswerList.createTime = createTime; | ||
193 | - } | ||
194 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
195 | - if (deleted != null) { | ||
196 | - courseProcessTopicsTopicAnswerList.deleted = deleted; | ||
197 | - } | ||
198 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
199 | - if (id != null) { | ||
200 | - courseProcessTopicsTopicAnswerList.id = id; | ||
201 | - } | ||
202 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
203 | - if (modifyTime != null) { | ||
204 | - courseProcessTopicsTopicAnswerList.modifyTime = modifyTime; | ||
205 | - } | ||
206 | - final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
207 | - if (picUrl != null) { | ||
208 | - courseProcessTopicsTopicAnswerList.picUrl = picUrl; | ||
209 | - } | ||
210 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
211 | - if (sortOrder != null) { | ||
212 | - courseProcessTopicsTopicAnswerList.sortOrder = sortOrder; | ||
213 | - } | ||
214 | - final int? topicId = jsonConvert.convert<int>(json['topicId']); | ||
215 | - if (topicId != null) { | ||
216 | - courseProcessTopicsTopicAnswerList.topicId = topicId; | ||
217 | - } | ||
218 | - final String? word = jsonConvert.convert<String>(json['word']); | ||
219 | - if (word != null) { | ||
220 | - courseProcessTopicsTopicAnswerList.word = word; | ||
221 | - } | ||
222 | - return courseProcessTopicsTopicAnswerList; | 325 | +Map<String, dynamic> $CourseProcessTopicsTopicAnswerListToJson( |
326 | + CourseProcessTopicsTopicAnswerList entity) { | ||
327 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
328 | + data['correct'] = entity.correct; | ||
329 | + data['createTime'] = entity.createTime; | ||
330 | + data['deleted'] = entity.deleted; | ||
331 | + data['id'] = entity.id; | ||
332 | + data['modifyTime'] = entity.modifyTime; | ||
333 | + data['picUrl'] = entity.picUrl; | ||
334 | + data['sortOrder'] = entity.sortOrder; | ||
335 | + data['topicId'] = entity.topicId; | ||
336 | + data['word'] = entity.word; | ||
337 | + return data; | ||
223 | } | 338 | } |
224 | 339 | ||
225 | -Map<String, dynamic> $CourseProcessTopicsTopicAnswerListToJson(CourseProcessTopicsTopicAnswerList entity) { | ||
226 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
227 | - data['correct'] = entity.correct; | ||
228 | - data['createTime'] = entity.createTime; | ||
229 | - data['deleted'] = entity.deleted; | ||
230 | - data['id'] = entity.id; | ||
231 | - data['modifyTime'] = entity.modifyTime; | ||
232 | - data['picUrl'] = entity.picUrl; | ||
233 | - data['sortOrder'] = entity.sortOrder; | ||
234 | - data['topicId'] = entity.topicId; | ||
235 | - data['word'] = entity.word; | ||
236 | - return data; | 340 | +extension CourseProcessTopicsTopicAnswerListExtension on CourseProcessTopicsTopicAnswerList { |
341 | + CourseProcessTopicsTopicAnswerList copyWith({ | ||
342 | + int? correct, | ||
343 | + String? createTime, | ||
344 | + String? deleted, | ||
345 | + String? id, | ||
346 | + String? modifyTime, | ||
347 | + String? picUrl, | ||
348 | + int? sortOrder, | ||
349 | + int? topicId, | ||
350 | + String? word, | ||
351 | + }) { | ||
352 | + return CourseProcessTopicsTopicAnswerList() | ||
353 | + ..correct = correct ?? this.correct | ||
354 | + ..createTime = createTime ?? this.createTime | ||
355 | + ..deleted = deleted ?? this.deleted | ||
356 | + ..id = id ?? this.id | ||
357 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
358 | + ..picUrl = picUrl ?? this.picUrl | ||
359 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
360 | + ..topicId = topicId ?? this.topicId | ||
361 | + ..word = word ?? this.word; | ||
362 | + } | ||
237 | } | 363 | } |
238 | 364 | ||
239 | CourseProcessVideos $CourseProcessVideosFromJson(Map<String, dynamic> json) { | 365 | CourseProcessVideos $CourseProcessVideosFromJson(Map<String, dynamic> json) { |
240 | - final CourseProcessVideos courseProcessVideos = CourseProcessVideos(); | ||
241 | - final int? courseLessonId = jsonConvert.convert<int>(json['courseLessonId']); | ||
242 | - if (courseLessonId != null) { | ||
243 | - courseProcessVideos.courseLessonId = courseLessonId; | ||
244 | - } | ||
245 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
246 | - if (createTime != null) { | ||
247 | - courseProcessVideos.createTime = createTime; | ||
248 | - } | ||
249 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
250 | - if (deleted != null) { | ||
251 | - courseProcessVideos.deleted = deleted; | ||
252 | - } | ||
253 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
254 | - if (id != null) { | ||
255 | - courseProcessVideos.id = id; | ||
256 | - } | ||
257 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
258 | - if (modifyTime != null) { | ||
259 | - courseProcessVideos.modifyTime = modifyTime; | ||
260 | - } | ||
261 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
262 | - if (sortOrder != null) { | ||
263 | - courseProcessVideos.sortOrder = sortOrder; | ||
264 | - } | ||
265 | - final String? subtitleUrl = jsonConvert.convert<String>(json['subtitleUrl']); | ||
266 | - if (subtitleUrl != null) { | ||
267 | - courseProcessVideos.subtitleUrl = subtitleUrl; | ||
268 | - } | ||
269 | - final String? videoUrl = jsonConvert.convert<String>(json['videoUrl']); | ||
270 | - if (videoUrl != null) { | ||
271 | - courseProcessVideos.videoUrl = videoUrl; | ||
272 | - } | ||
273 | - return courseProcessVideos; | 366 | + final CourseProcessVideos courseProcessVideos = CourseProcessVideos(); |
367 | + final int? courseLessonId = jsonConvert.convert<int>(json['courseLessonId']); | ||
368 | + if (courseLessonId != null) { | ||
369 | + courseProcessVideos.courseLessonId = courseLessonId; | ||
370 | + } | ||
371 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
372 | + if (createTime != null) { | ||
373 | + courseProcessVideos.createTime = createTime; | ||
374 | + } | ||
375 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
376 | + if (deleted != null) { | ||
377 | + courseProcessVideos.deleted = deleted; | ||
378 | + } | ||
379 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
380 | + if (id != null) { | ||
381 | + courseProcessVideos.id = id; | ||
382 | + } | ||
383 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
384 | + if (modifyTime != null) { | ||
385 | + courseProcessVideos.modifyTime = modifyTime; | ||
386 | + } | ||
387 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
388 | + if (sortOrder != null) { | ||
389 | + courseProcessVideos.sortOrder = sortOrder; | ||
390 | + } | ||
391 | + final String? subtitleUrl = jsonConvert.convert<String>(json['subtitleUrl']); | ||
392 | + if (subtitleUrl != null) { | ||
393 | + courseProcessVideos.subtitleUrl = subtitleUrl; | ||
394 | + } | ||
395 | + final String? videoUrl = jsonConvert.convert<String>(json['videoUrl']); | ||
396 | + if (videoUrl != null) { | ||
397 | + courseProcessVideos.videoUrl = videoUrl; | ||
398 | + } | ||
399 | + return courseProcessVideos; | ||
274 | } | 400 | } |
275 | 401 | ||
276 | Map<String, dynamic> $CourseProcessVideosToJson(CourseProcessVideos entity) { | 402 | Map<String, dynamic> $CourseProcessVideosToJson(CourseProcessVideos entity) { |
277 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
278 | - data['courseLessonId'] = entity.courseLessonId; | ||
279 | - data['createTime'] = entity.createTime; | ||
280 | - data['deleted'] = entity.deleted; | ||
281 | - data['id'] = entity.id; | ||
282 | - data['modifyTime'] = entity.modifyTime; | ||
283 | - data['sortOrder'] = entity.sortOrder; | ||
284 | - data['subtitleUrl'] = entity.subtitleUrl; | ||
285 | - data['videoUrl'] = entity.videoUrl; | ||
286 | - return data; | 403 | + final Map<String, dynamic> data = <String, dynamic>{}; |
404 | + data['courseLessonId'] = entity.courseLessonId; | ||
405 | + data['createTime'] = entity.createTime; | ||
406 | + data['deleted'] = entity.deleted; | ||
407 | + data['id'] = entity.id; | ||
408 | + data['modifyTime'] = entity.modifyTime; | ||
409 | + data['sortOrder'] = entity.sortOrder; | ||
410 | + data['subtitleUrl'] = entity.subtitleUrl; | ||
411 | + data['videoUrl'] = entity.videoUrl; | ||
412 | + return data; | ||
413 | +} | ||
414 | + | ||
415 | +extension CourseProcessVideosExtension on CourseProcessVideos { | ||
416 | + CourseProcessVideos copyWith({ | ||
417 | + int? courseLessonId, | ||
418 | + String? createTime, | ||
419 | + String? deleted, | ||
420 | + String? id, | ||
421 | + String? modifyTime, | ||
422 | + int? sortOrder, | ||
423 | + String? subtitleUrl, | ||
424 | + String? videoUrl, | ||
425 | + }) { | ||
426 | + return CourseProcessVideos() | ||
427 | + ..courseLessonId = courseLessonId ?? this.courseLessonId | ||
428 | + ..createTime = createTime ?? this.createTime | ||
429 | + ..deleted = deleted ?? this.deleted | ||
430 | + ..id = id ?? this.id | ||
431 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
432 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
433 | + ..subtitleUrl = subtitleUrl ?? this.subtitleUrl | ||
434 | + ..videoUrl = videoUrl ?? this.videoUrl; | ||
435 | + } | ||
287 | } | 436 | } |
288 | \ No newline at end of file | 437 | \ No newline at end of file |
lib/generated/json/follow_read_entity.g.dart
@@ -2,66 +2,95 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | @@ -2,66 +2,95 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | import 'package:wow_english/models/follow_read_entity.dart'; | 2 | import 'package:wow_english/models/follow_read_entity.dart'; |
3 | 3 | ||
4 | FollowReadEntity $FollowReadEntityFromJson(Map<String, dynamic> json) { | 4 | FollowReadEntity $FollowReadEntityFromJson(Map<String, dynamic> json) { |
5 | - final FollowReadEntity followReadEntity = FollowReadEntity(); | ||
6 | - final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
7 | - if (coverUrl != null) { | ||
8 | - followReadEntity.coverUrl = coverUrl; | ||
9 | - } | ||
10 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
11 | - if (createTime != null) { | ||
12 | - followReadEntity.createTime = createTime; | ||
13 | - } | ||
14 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
15 | - if (deleted != null) { | ||
16 | - followReadEntity.deleted = deleted; | ||
17 | - } | ||
18 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
19 | - if (id != null) { | ||
20 | - followReadEntity.id = id; | ||
21 | - } | ||
22 | - final bool? lock = jsonConvert.convert<bool>(json['lock']); | ||
23 | - if (lock != null) { | ||
24 | - followReadEntity.lock = lock; | ||
25 | - } | ||
26 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
27 | - if (modifyTime != null) { | ||
28 | - followReadEntity.modifyTime = modifyTime; | ||
29 | - } | ||
30 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
31 | - if (sortOrder != null) { | ||
32 | - followReadEntity.sortOrder = sortOrder; | ||
33 | - } | ||
34 | - final int? star = jsonConvert.convert<int>(json['star']); | ||
35 | - if (star != null) { | ||
36 | - followReadEntity.star = star; | ||
37 | - } | ||
38 | - final int? status = jsonConvert.convert<int>(json['status']); | ||
39 | - if (status != null) { | ||
40 | - followReadEntity.status = status; | ||
41 | - } | ||
42 | - final String? title = jsonConvert.convert<String>(json['title']); | ||
43 | - if (title != null) { | ||
44 | - followReadEntity.title = title; | ||
45 | - } | ||
46 | - final int? videoTotal = jsonConvert.convert<int>(json['videoTotal']); | ||
47 | - if (videoTotal != null) { | ||
48 | - followReadEntity.videoTotal = videoTotal; | ||
49 | - } | ||
50 | - return followReadEntity; | 5 | + final FollowReadEntity followReadEntity = FollowReadEntity(); |
6 | + final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
7 | + if (coverUrl != null) { | ||
8 | + followReadEntity.coverUrl = coverUrl; | ||
9 | + } | ||
10 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
11 | + if (createTime != null) { | ||
12 | + followReadEntity.createTime = createTime; | ||
13 | + } | ||
14 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
15 | + if (deleted != null) { | ||
16 | + followReadEntity.deleted = deleted; | ||
17 | + } | ||
18 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
19 | + if (id != null) { | ||
20 | + followReadEntity.id = id; | ||
21 | + } | ||
22 | + final bool? lock = jsonConvert.convert<bool>(json['lock']); | ||
23 | + if (lock != null) { | ||
24 | + followReadEntity.lock = lock; | ||
25 | + } | ||
26 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
27 | + if (modifyTime != null) { | ||
28 | + followReadEntity.modifyTime = modifyTime; | ||
29 | + } | ||
30 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
31 | + if (sortOrder != null) { | ||
32 | + followReadEntity.sortOrder = sortOrder; | ||
33 | + } | ||
34 | + final int? star = jsonConvert.convert<int>(json['star']); | ||
35 | + if (star != null) { | ||
36 | + followReadEntity.star = star; | ||
37 | + } | ||
38 | + final int? status = jsonConvert.convert<int>(json['status']); | ||
39 | + if (status != null) { | ||
40 | + followReadEntity.status = status; | ||
41 | + } | ||
42 | + final String? title = jsonConvert.convert<String>(json['title']); | ||
43 | + if (title != null) { | ||
44 | + followReadEntity.title = title; | ||
45 | + } | ||
46 | + final int? videoTotal = jsonConvert.convert<int>(json['videoTotal']); | ||
47 | + if (videoTotal != null) { | ||
48 | + followReadEntity.videoTotal = videoTotal; | ||
49 | + } | ||
50 | + return followReadEntity; | ||
51 | } | 51 | } |
52 | 52 | ||
53 | Map<String, dynamic> $FollowReadEntityToJson(FollowReadEntity entity) { | 53 | Map<String, dynamic> $FollowReadEntityToJson(FollowReadEntity entity) { |
54 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
55 | - data['coverUrl'] = entity.coverUrl; | ||
56 | - data['createTime'] = entity.createTime; | ||
57 | - data['deleted'] = entity.deleted; | ||
58 | - data['id'] = entity.id; | ||
59 | - data['lock'] = entity.lock; | ||
60 | - data['modifyTime'] = entity.modifyTime; | ||
61 | - data['sortOrder'] = entity.sortOrder; | ||
62 | - data['star'] = entity.star; | ||
63 | - data['status'] = entity.status; | ||
64 | - data['title'] = entity.title; | ||
65 | - data['videoTotal'] = entity.videoTotal; | ||
66 | - return data; | 54 | + final Map<String, dynamic> data = <String, dynamic>{}; |
55 | + data['coverUrl'] = entity.coverUrl; | ||
56 | + data['createTime'] = entity.createTime; | ||
57 | + data['deleted'] = entity.deleted; | ||
58 | + data['id'] = entity.id; | ||
59 | + data['lock'] = entity.lock; | ||
60 | + data['modifyTime'] = entity.modifyTime; | ||
61 | + data['sortOrder'] = entity.sortOrder; | ||
62 | + data['star'] = entity.star; | ||
63 | + data['status'] = entity.status; | ||
64 | + data['title'] = entity.title; | ||
65 | + data['videoTotal'] = entity.videoTotal; | ||
66 | + return data; | ||
67 | +} | ||
68 | + | ||
69 | +extension FollowReadEntityExtension on FollowReadEntity { | ||
70 | + FollowReadEntity copyWith({ | ||
71 | + String? coverUrl, | ||
72 | + String? createTime, | ||
73 | + String? deleted, | ||
74 | + String? id, | ||
75 | + bool? lock, | ||
76 | + String? modifyTime, | ||
77 | + int? sortOrder, | ||
78 | + int? star, | ||
79 | + int? status, | ||
80 | + String? title, | ||
81 | + int? videoTotal, | ||
82 | + }) { | ||
83 | + return FollowReadEntity() | ||
84 | + ..coverUrl = coverUrl ?? this.coverUrl | ||
85 | + ..createTime = createTime ?? this.createTime | ||
86 | + ..deleted = deleted ?? this.deleted | ||
87 | + ..id = id ?? this.id | ||
88 | + ..lock = lock ?? this.lock | ||
89 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
90 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
91 | + ..star = star ?? this.star | ||
92 | + ..status = status ?? this.status | ||
93 | + ..title = title ?? this.title | ||
94 | + ..videoTotal = videoTotal ?? this.videoTotal; | ||
95 | + } | ||
67 | } | 96 | } |
68 | \ No newline at end of file | 97 | \ No newline at end of file |
lib/generated/json/listen_entity.g.dart
@@ -2,66 +2,95 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | @@ -2,66 +2,95 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | import 'package:wow_english/models/listen_entity.dart'; | 2 | import 'package:wow_english/models/listen_entity.dart'; |
3 | 3 | ||
4 | ListenEntity $ListenEntityFromJson(Map<String, dynamic> json) { | 4 | ListenEntity $ListenEntityFromJson(Map<String, dynamic> json) { |
5 | - final ListenEntity listenEntity = ListenEntity(); | ||
6 | - final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
7 | - if (coverUrl != null) { | ||
8 | - listenEntity.coverUrl = coverUrl; | ||
9 | - } | ||
10 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
11 | - if (createTime != null) { | ||
12 | - listenEntity.createTime = createTime; | ||
13 | - } | ||
14 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
15 | - if (deleted != null) { | ||
16 | - listenEntity.deleted = deleted; | ||
17 | - } | ||
18 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
19 | - if (id != null) { | ||
20 | - listenEntity.id = id; | ||
21 | - } | ||
22 | - final bool? lock = jsonConvert.convert<bool>(json['lock']); | ||
23 | - if (lock != null) { | ||
24 | - listenEntity.lock = lock; | ||
25 | - } | ||
26 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
27 | - if (modifyTime != null) { | ||
28 | - listenEntity.modifyTime = modifyTime; | ||
29 | - } | ||
30 | - final double? sortOrder = jsonConvert.convert<double>(json['sortOrder']); | ||
31 | - if (sortOrder != null) { | ||
32 | - listenEntity.sortOrder = sortOrder; | ||
33 | - } | ||
34 | - final double? status = jsonConvert.convert<double>(json['status']); | ||
35 | - if (status != null) { | ||
36 | - listenEntity.status = status; | ||
37 | - } | ||
38 | - final String? subtitleUrl = jsonConvert.convert<String>(json['subtitleUrl']); | ||
39 | - if (subtitleUrl != null) { | ||
40 | - listenEntity.subtitleUrl = subtitleUrl; | ||
41 | - } | ||
42 | - final String? title = jsonConvert.convert<String>(json['title']); | ||
43 | - if (title != null) { | ||
44 | - listenEntity.title = title; | ||
45 | - } | ||
46 | - final String? videoUrl = jsonConvert.convert<String>(json['videoUrl']); | ||
47 | - if (videoUrl != null) { | ||
48 | - listenEntity.videoUrl = videoUrl; | ||
49 | - } | ||
50 | - return listenEntity; | 5 | + final ListenEntity listenEntity = ListenEntity(); |
6 | + final String? coverUrl = jsonConvert.convert<String>(json['coverUrl']); | ||
7 | + if (coverUrl != null) { | ||
8 | + listenEntity.coverUrl = coverUrl; | ||
9 | + } | ||
10 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
11 | + if (createTime != null) { | ||
12 | + listenEntity.createTime = createTime; | ||
13 | + } | ||
14 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
15 | + if (deleted != null) { | ||
16 | + listenEntity.deleted = deleted; | ||
17 | + } | ||
18 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
19 | + if (id != null) { | ||
20 | + listenEntity.id = id; | ||
21 | + } | ||
22 | + final bool? lock = jsonConvert.convert<bool>(json['lock']); | ||
23 | + if (lock != null) { | ||
24 | + listenEntity.lock = lock; | ||
25 | + } | ||
26 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
27 | + if (modifyTime != null) { | ||
28 | + listenEntity.modifyTime = modifyTime; | ||
29 | + } | ||
30 | + final double? sortOrder = jsonConvert.convert<double>(json['sortOrder']); | ||
31 | + if (sortOrder != null) { | ||
32 | + listenEntity.sortOrder = sortOrder; | ||
33 | + } | ||
34 | + final double? status = jsonConvert.convert<double>(json['status']); | ||
35 | + if (status != null) { | ||
36 | + listenEntity.status = status; | ||
37 | + } | ||
38 | + final String? subtitleUrl = jsonConvert.convert<String>(json['subtitleUrl']); | ||
39 | + if (subtitleUrl != null) { | ||
40 | + listenEntity.subtitleUrl = subtitleUrl; | ||
41 | + } | ||
42 | + final String? title = jsonConvert.convert<String>(json['title']); | ||
43 | + if (title != null) { | ||
44 | + listenEntity.title = title; | ||
45 | + } | ||
46 | + final String? videoUrl = jsonConvert.convert<String>(json['videoUrl']); | ||
47 | + if (videoUrl != null) { | ||
48 | + listenEntity.videoUrl = videoUrl; | ||
49 | + } | ||
50 | + return listenEntity; | ||
51 | } | 51 | } |
52 | 52 | ||
53 | Map<String, dynamic> $ListenEntityToJson(ListenEntity entity) { | 53 | Map<String, dynamic> $ListenEntityToJson(ListenEntity entity) { |
54 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
55 | - data['coverUrl'] = entity.coverUrl; | ||
56 | - data['createTime'] = entity.createTime; | ||
57 | - data['deleted'] = entity.deleted; | ||
58 | - data['id'] = entity.id; | ||
59 | - data['lock'] = entity.lock; | ||
60 | - data['modifyTime'] = entity.modifyTime; | ||
61 | - data['sortOrder'] = entity.sortOrder; | ||
62 | - data['status'] = entity.status; | ||
63 | - data['subtitleUrl'] = entity.subtitleUrl; | ||
64 | - data['title'] = entity.title; | ||
65 | - data['videoUrl'] = entity.videoUrl; | ||
66 | - return data; | 54 | + final Map<String, dynamic> data = <String, dynamic>{}; |
55 | + data['coverUrl'] = entity.coverUrl; | ||
56 | + data['createTime'] = entity.createTime; | ||
57 | + data['deleted'] = entity.deleted; | ||
58 | + data['id'] = entity.id; | ||
59 | + data['lock'] = entity.lock; | ||
60 | + data['modifyTime'] = entity.modifyTime; | ||
61 | + data['sortOrder'] = entity.sortOrder; | ||
62 | + data['status'] = entity.status; | ||
63 | + data['subtitleUrl'] = entity.subtitleUrl; | ||
64 | + data['title'] = entity.title; | ||
65 | + data['videoUrl'] = entity.videoUrl; | ||
66 | + return data; | ||
67 | +} | ||
68 | + | ||
69 | +extension ListenEntityExtension on ListenEntity { | ||
70 | + ListenEntity copyWith({ | ||
71 | + String? coverUrl, | ||
72 | + String? createTime, | ||
73 | + String? deleted, | ||
74 | + String? id, | ||
75 | + bool? lock, | ||
76 | + String? modifyTime, | ||
77 | + double? sortOrder, | ||
78 | + double? status, | ||
79 | + String? subtitleUrl, | ||
80 | + String? title, | ||
81 | + String? videoUrl, | ||
82 | + }) { | ||
83 | + return ListenEntity() | ||
84 | + ..coverUrl = coverUrl ?? this.coverUrl | ||
85 | + ..createTime = createTime ?? this.createTime | ||
86 | + ..deleted = deleted ?? this.deleted | ||
87 | + ..id = id ?? this.id | ||
88 | + ..lock = lock ?? this.lock | ||
89 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
90 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
91 | + ..status = status ?? this.status | ||
92 | + ..subtitleUrl = subtitleUrl ?? this.subtitleUrl | ||
93 | + ..title = title ?? this.title | ||
94 | + ..videoUrl = videoUrl ?? this.videoUrl; | ||
95 | + } | ||
67 | } | 96 | } |
68 | \ No newline at end of file | 97 | \ No newline at end of file |
lib/generated/json/product_entity.g.dart
0 → 100644
1 | +import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | +import 'package:wow_english/models/product_entity.dart'; | ||
3 | + | ||
4 | +ProductEntity $ProductEntityFromJson(Map<String, dynamic> json) { | ||
5 | + final ProductEntity productEntity = ProductEntity(); | ||
6 | + final int? id = jsonConvert.convert<int>(json['id']); | ||
7 | + if (id != null) { | ||
8 | + productEntity.id = id; | ||
9 | + } | ||
10 | + final String? name = jsonConvert.convert<String>(json['name']); | ||
11 | + if (name != null) { | ||
12 | + productEntity.name = name; | ||
13 | + } | ||
14 | + final String? title = jsonConvert.convert<String>(json['title']); | ||
15 | + if (title != null) { | ||
16 | + productEntity.title = title; | ||
17 | + } | ||
18 | + final double? price = jsonConvert.convert<double>(json['price']); | ||
19 | + if (price != null) { | ||
20 | + productEntity.price = price; | ||
21 | + } | ||
22 | + final String? picUrl = jsonConvert.convert<String>(json['picUrl']); | ||
23 | + if (picUrl != null) { | ||
24 | + productEntity.picUrl = picUrl; | ||
25 | + } | ||
26 | + final String? bannerPicUrl = jsonConvert.convert<String>( | ||
27 | + json['bannerPicUrl']); | ||
28 | + if (bannerPicUrl != null) { | ||
29 | + productEntity.bannerPicUrl = bannerPicUrl; | ||
30 | + } | ||
31 | + final String? detailPicUrl = jsonConvert.convert<String>( | ||
32 | + json['detailPicUrl']); | ||
33 | + if (detailPicUrl != null) { | ||
34 | + productEntity.detailPicUrl = detailPicUrl; | ||
35 | + } | ||
36 | + final int? saleType = jsonConvert.convert<int>(json['saleType']); | ||
37 | + if (saleType != null) { | ||
38 | + productEntity.saleType = saleType; | ||
39 | + } | ||
40 | + final int? status = jsonConvert.convert<int>(json['status']); | ||
41 | + if (status != null) { | ||
42 | + productEntity.status = status; | ||
43 | + } | ||
44 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
45 | + if (sortOrder != null) { | ||
46 | + productEntity.sortOrder = sortOrder; | ||
47 | + } | ||
48 | + final int? validityType = jsonConvert.convert<int>(json['validityType']); | ||
49 | + if (validityType != null) { | ||
50 | + productEntity.validityType = validityType; | ||
51 | + } | ||
52 | + return productEntity; | ||
53 | +} | ||
54 | + | ||
55 | +Map<String, dynamic> $ProductEntityToJson(ProductEntity entity) { | ||
56 | + final Map<String, dynamic> data = <String, dynamic>{}; | ||
57 | + data['id'] = entity.id; | ||
58 | + data['name'] = entity.name; | ||
59 | + data['title'] = entity.title; | ||
60 | + data['price'] = entity.price; | ||
61 | + data['picUrl'] = entity.picUrl; | ||
62 | + data['bannerPicUrl'] = entity.bannerPicUrl; | ||
63 | + data['detailPicUrl'] = entity.detailPicUrl; | ||
64 | + data['saleType'] = entity.saleType; | ||
65 | + data['status'] = entity.status; | ||
66 | + data['sortOrder'] = entity.sortOrder; | ||
67 | + data['validityType'] = entity.validityType; | ||
68 | + return data; | ||
69 | +} | ||
70 | + | ||
71 | +extension ProductEntityExtension on ProductEntity { | ||
72 | + ProductEntity copyWith({ | ||
73 | + int? id, | ||
74 | + String? name, | ||
75 | + String? title, | ||
76 | + double? price, | ||
77 | + String? picUrl, | ||
78 | + String? bannerPicUrl, | ||
79 | + String? detailPicUrl, | ||
80 | + int? saleType, | ||
81 | + int? status, | ||
82 | + int? sortOrder, | ||
83 | + int? validityType, | ||
84 | + }) { | ||
85 | + return ProductEntity() | ||
86 | + ..id = id ?? this.id | ||
87 | + ..name = name ?? this.name | ||
88 | + ..title = title ?? this.title | ||
89 | + ..price = price ?? this.price | ||
90 | + ..picUrl = picUrl ?? this.picUrl | ||
91 | + ..bannerPicUrl = bannerPicUrl ?? this.bannerPicUrl | ||
92 | + ..detailPicUrl = detailPicUrl ?? this.detailPicUrl | ||
93 | + ..saleType = saleType ?? this.saleType | ||
94 | + ..status = status ?? this.status | ||
95 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
96 | + ..validityType = validityType ?? this.validityType; | ||
97 | + } | ||
98 | +} | ||
0 | \ No newline at end of file | 99 | \ No newline at end of file |
lib/generated/json/read_content_entity.g.dart
@@ -2,56 +2,82 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | @@ -2,56 +2,82 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | import 'package:wow_english/models/read_content_entity.dart'; | 2 | import 'package:wow_english/models/read_content_entity.dart'; |
3 | 3 | ||
4 | ReadContentEntity $ReadContentEntityFromJson(Map<String, dynamic> json) { | 4 | ReadContentEntity $ReadContentEntityFromJson(Map<String, dynamic> json) { |
5 | - final ReadContentEntity readContentEntity = ReadContentEntity(); | ||
6 | - final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
7 | - if (createTime != null) { | ||
8 | - readContentEntity.createTime = createTime; | ||
9 | - } | ||
10 | - final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
11 | - if (deleted != null) { | ||
12 | - readContentEntity.deleted = deleted; | ||
13 | - } | ||
14 | - final String? id = jsonConvert.convert<String>(json['id']); | ||
15 | - if (id != null) { | ||
16 | - readContentEntity.id = id; | ||
17 | - } | ||
18 | - final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
19 | - if (modifyTime != null) { | ||
20 | - readContentEntity.modifyTime = modifyTime; | ||
21 | - } | ||
22 | - final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
23 | - if (sortOrder != null) { | ||
24 | - readContentEntity.sortOrder = sortOrder; | ||
25 | - } | ||
26 | - final int? status = jsonConvert.convert<int>(json['status']); | ||
27 | - if (status != null) { | ||
28 | - readContentEntity.status = status; | ||
29 | - } | ||
30 | - final int? videoFollowReadId = jsonConvert.convert<int>(json['videoFollowReadId']); | ||
31 | - if (videoFollowReadId != null) { | ||
32 | - readContentEntity.videoFollowReadId = videoFollowReadId; | ||
33 | - } | ||
34 | - final String? videoUrl = jsonConvert.convert<String>(json['videoUrl']); | ||
35 | - if (videoUrl != null) { | ||
36 | - readContentEntity.videoUrl = videoUrl; | ||
37 | - } | ||
38 | - final String? word = jsonConvert.convert<String>(json['word']); | ||
39 | - if (word != null) { | ||
40 | - readContentEntity.word = word; | ||
41 | - } | ||
42 | - return readContentEntity; | 5 | + final ReadContentEntity readContentEntity = ReadContentEntity(); |
6 | + final String? createTime = jsonConvert.convert<String>(json['createTime']); | ||
7 | + if (createTime != null) { | ||
8 | + readContentEntity.createTime = createTime; | ||
9 | + } | ||
10 | + final String? deleted = jsonConvert.convert<String>(json['deleted']); | ||
11 | + if (deleted != null) { | ||
12 | + readContentEntity.deleted = deleted; | ||
13 | + } | ||
14 | + final String? id = jsonConvert.convert<String>(json['id']); | ||
15 | + if (id != null) { | ||
16 | + readContentEntity.id = id; | ||
17 | + } | ||
18 | + final String? modifyTime = jsonConvert.convert<String>(json['modifyTime']); | ||
19 | + if (modifyTime != null) { | ||
20 | + readContentEntity.modifyTime = modifyTime; | ||
21 | + } | ||
22 | + final int? sortOrder = jsonConvert.convert<int>(json['sortOrder']); | ||
23 | + if (sortOrder != null) { | ||
24 | + readContentEntity.sortOrder = sortOrder; | ||
25 | + } | ||
26 | + final int? status = jsonConvert.convert<int>(json['status']); | ||
27 | + if (status != null) { | ||
28 | + readContentEntity.status = status; | ||
29 | + } | ||
30 | + final int? videoFollowReadId = jsonConvert.convert<int>( | ||
31 | + json['videoFollowReadId']); | ||
32 | + if (videoFollowReadId != null) { | ||
33 | + readContentEntity.videoFollowReadId = videoFollowReadId; | ||
34 | + } | ||
35 | + final String? videoUrl = jsonConvert.convert<String>(json['videoUrl']); | ||
36 | + if (videoUrl != null) { | ||
37 | + readContentEntity.videoUrl = videoUrl; | ||
38 | + } | ||
39 | + final String? word = jsonConvert.convert<String>(json['word']); | ||
40 | + if (word != null) { | ||
41 | + readContentEntity.word = word; | ||
42 | + } | ||
43 | + return readContentEntity; | ||
43 | } | 44 | } |
44 | 45 | ||
45 | Map<String, dynamic> $ReadContentEntityToJson(ReadContentEntity entity) { | 46 | Map<String, dynamic> $ReadContentEntityToJson(ReadContentEntity entity) { |
46 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
47 | - data['createTime'] = entity.createTime; | ||
48 | - data['deleted'] = entity.deleted; | ||
49 | - data['id'] = entity.id; | ||
50 | - data['modifyTime'] = entity.modifyTime; | ||
51 | - data['sortOrder'] = entity.sortOrder; | ||
52 | - data['status'] = entity.status; | ||
53 | - data['videoFollowReadId'] = entity.videoFollowReadId; | ||
54 | - data['videoUrl'] = entity.videoUrl; | ||
55 | - data['word'] = entity.word; | ||
56 | - return data; | 47 | + final Map<String, dynamic> data = <String, dynamic>{}; |
48 | + data['createTime'] = entity.createTime; | ||
49 | + data['deleted'] = entity.deleted; | ||
50 | + data['id'] = entity.id; | ||
51 | + data['modifyTime'] = entity.modifyTime; | ||
52 | + data['sortOrder'] = entity.sortOrder; | ||
53 | + data['status'] = entity.status; | ||
54 | + data['videoFollowReadId'] = entity.videoFollowReadId; | ||
55 | + data['videoUrl'] = entity.videoUrl; | ||
56 | + data['word'] = entity.word; | ||
57 | + return data; | ||
58 | +} | ||
59 | + | ||
60 | +extension ReadContentEntityExtension on ReadContentEntity { | ||
61 | + ReadContentEntity copyWith({ | ||
62 | + String? createTime, | ||
63 | + String? deleted, | ||
64 | + String? id, | ||
65 | + String? modifyTime, | ||
66 | + int? sortOrder, | ||
67 | + int? status, | ||
68 | + int? videoFollowReadId, | ||
69 | + String? videoUrl, | ||
70 | + String? word, | ||
71 | + }) { | ||
72 | + return ReadContentEntity() | ||
73 | + ..createTime = createTime ?? this.createTime | ||
74 | + ..deleted = deleted ?? this.deleted | ||
75 | + ..id = id ?? this.id | ||
76 | + ..modifyTime = modifyTime ?? this.modifyTime | ||
77 | + ..sortOrder = sortOrder ?? this.sortOrder | ||
78 | + ..status = status ?? this.status | ||
79 | + ..videoFollowReadId = videoFollowReadId ?? this.videoFollowReadId | ||
80 | + ..videoUrl = videoUrl ?? this.videoUrl | ||
81 | + ..word = word ?? this.word; | ||
82 | + } | ||
57 | } | 83 | } |
58 | \ No newline at end of file | 84 | \ No newline at end of file |
lib/generated/json/user_entity.g.dart
@@ -2,61 +2,90 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | @@ -2,61 +2,90 @@ import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
2 | import 'package:wow_english/models/user_entity.dart'; | 2 | import 'package:wow_english/models/user_entity.dart'; |
3 | 3 | ||
4 | UserEntity $UserEntityFromJson(Map<String, dynamic> json) { | 4 | UserEntity $UserEntityFromJson(Map<String, dynamic> json) { |
5 | - final UserEntity userEntity = UserEntity(); | ||
6 | - final int? id = jsonConvert.convert<int>(json['id']); | ||
7 | - if (id != null) { | ||
8 | - userEntity.id = id; | ||
9 | - } | ||
10 | - final String? name = jsonConvert.convert<String>(json['name']); | ||
11 | - if (name != null) { | ||
12 | - userEntity.name = name; | ||
13 | - } | ||
14 | - final String? token = jsonConvert.convert<String>(json['token']); | ||
15 | - if (token != null) { | ||
16 | - userEntity.token = token; | ||
17 | - } | ||
18 | - final int? age = jsonConvert.convert<int>(json['age']); | ||
19 | - if (age != null) { | ||
20 | - userEntity.age = age; | ||
21 | - } | ||
22 | - final int? gender = jsonConvert.convert<int>(json['gender']); | ||
23 | - if (gender != null) { | ||
24 | - userEntity.gender = gender; | ||
25 | - } | ||
26 | - final String? avatarUrl = jsonConvert.convert<String>(json['avatarUrl']); | ||
27 | - if (avatarUrl != null) { | ||
28 | - userEntity.avatarUrl = avatarUrl; | ||
29 | - } | ||
30 | - final String? phoneNum = jsonConvert.convert<String>(json['phoneNum']); | ||
31 | - if (phoneNum != null) { | ||
32 | - userEntity.phoneNum = phoneNum; | ||
33 | - } | ||
34 | - final int? fillUserInfo = jsonConvert.convert<int>(json['fillUserInfo']); | ||
35 | - if (fillUserInfo != null) { | ||
36 | - userEntity.fillUserInfo = fillUserInfo; | ||
37 | - } | ||
38 | - final int? nowCourseModuleId = jsonConvert.convert<int>(json['nowCourseModuleId']); | ||
39 | - if (nowCourseModuleId != null) { | ||
40 | - userEntity.nowCourseModuleId = nowCourseModuleId; | ||
41 | - } | ||
42 | - final String? effectiveDate = jsonConvert.convert<String>(json['effectiveDate']); | ||
43 | - if (effectiveDate != null) { | ||
44 | - userEntity.effectiveDate = effectiveDate; | ||
45 | - } | ||
46 | - return userEntity; | 5 | + final UserEntity userEntity = UserEntity(); |
6 | + final int? id = jsonConvert.convert<int>(json['id']); | ||
7 | + if (id != null) { | ||
8 | + userEntity.id = id; | ||
9 | + } | ||
10 | + final String? name = jsonConvert.convert<String>(json['name']); | ||
11 | + if (name != null) { | ||
12 | + userEntity.name = name; | ||
13 | + } | ||
14 | + final String? token = jsonConvert.convert<String>(json['token']); | ||
15 | + if (token != null) { | ||
16 | + userEntity.token = token; | ||
17 | + } | ||
18 | + final int? age = jsonConvert.convert<int>(json['age']); | ||
19 | + if (age != null) { | ||
20 | + userEntity.age = age; | ||
21 | + } | ||
22 | + final int? gender = jsonConvert.convert<int>(json['gender']); | ||
23 | + if (gender != null) { | ||
24 | + userEntity.gender = gender; | ||
25 | + } | ||
26 | + final String? avatarUrl = jsonConvert.convert<String>(json['avatarUrl']); | ||
27 | + if (avatarUrl != null) { | ||
28 | + userEntity.avatarUrl = avatarUrl; | ||
29 | + } | ||
30 | + final String? phoneNum = jsonConvert.convert<String>(json['phoneNum']); | ||
31 | + if (phoneNum != null) { | ||
32 | + userEntity.phoneNum = phoneNum; | ||
33 | + } | ||
34 | + final int? fillUserInfo = jsonConvert.convert<int>(json['fillUserInfo']); | ||
35 | + if (fillUserInfo != null) { | ||
36 | + userEntity.fillUserInfo = fillUserInfo; | ||
37 | + } | ||
38 | + final int? nowCourseModuleId = jsonConvert.convert<int>( | ||
39 | + json['nowCourseModuleId']); | ||
40 | + if (nowCourseModuleId != null) { | ||
41 | + userEntity.nowCourseModuleId = nowCourseModuleId; | ||
42 | + } | ||
43 | + final String? effectiveDate = jsonConvert.convert<String>( | ||
44 | + json['effectiveDate']); | ||
45 | + if (effectiveDate != null) { | ||
46 | + userEntity.effectiveDate = effectiveDate; | ||
47 | + } | ||
48 | + return userEntity; | ||
47 | } | 49 | } |
48 | 50 | ||
49 | Map<String, dynamic> $UserEntityToJson(UserEntity entity) { | 51 | Map<String, dynamic> $UserEntityToJson(UserEntity entity) { |
50 | - final Map<String, dynamic> data = <String, dynamic>{}; | ||
51 | - data['id'] = entity.id; | ||
52 | - data['name'] = entity.name; | ||
53 | - data['token'] = entity.token; | ||
54 | - data['age'] = entity.age; | ||
55 | - data['gender'] = entity.gender; | ||
56 | - data['avatarUrl'] = entity.avatarUrl; | ||
57 | - data['phoneNum'] = entity.phoneNum; | ||
58 | - data['fillUserInfo'] = entity.fillUserInfo; | ||
59 | - data['nowCourseModuleId'] = entity.nowCourseModuleId; | ||
60 | - data['effectiveDate'] = entity.effectiveDate; | ||
61 | - return data; | 52 | + final Map<String, dynamic> data = <String, dynamic>{}; |
53 | + data['id'] = entity.id; | ||
54 | + data['name'] = entity.name; | ||
55 | + data['token'] = entity.token; | ||
56 | + data['age'] = entity.age; | ||
57 | + data['gender'] = entity.gender; | ||
58 | + data['avatarUrl'] = entity.avatarUrl; | ||
59 | + data['phoneNum'] = entity.phoneNum; | ||
60 | + data['fillUserInfo'] = entity.fillUserInfo; | ||
61 | + data['nowCourseModuleId'] = entity.nowCourseModuleId; | ||
62 | + data['effectiveDate'] = entity.effectiveDate; | ||
63 | + return data; | ||
64 | +} | ||
65 | + | ||
66 | +extension UserEntityExtension on UserEntity { | ||
67 | + UserEntity copyWith({ | ||
68 | + int? id, | ||
69 | + String? name, | ||
70 | + String? token, | ||
71 | + int? age, | ||
72 | + int? gender, | ||
73 | + String? avatarUrl, | ||
74 | + String? phoneNum, | ||
75 | + int? fillUserInfo, | ||
76 | + int? nowCourseModuleId, | ||
77 | + String? effectiveDate, | ||
78 | + }) { | ||
79 | + return UserEntity() | ||
80 | + ..id = id ?? this.id | ||
81 | + ..name = name ?? this.name | ||
82 | + ..token = token ?? this.token | ||
83 | + ..age = age ?? this.age | ||
84 | + ..gender = gender ?? this.gender | ||
85 | + ..avatarUrl = avatarUrl ?? this.avatarUrl | ||
86 | + ..phoneNum = phoneNum ?? this.phoneNum | ||
87 | + ..fillUserInfo = fillUserInfo ?? this.fillUserInfo | ||
88 | + ..nowCourseModuleId = nowCourseModuleId ?? this.nowCourseModuleId | ||
89 | + ..effectiveDate = effectiveDate ?? this.effectiveDate; | ||
90 | + } | ||
62 | } | 91 | } |
63 | \ No newline at end of file | 92 | \ No newline at end of file |
lib/models/product_entity.dart
0 → 100644
1 | +import 'package:wow_english/generated/json/base/json_field.dart'; | ||
2 | +import 'package:wow_english/generated/json/product_entity.g.dart'; | ||
3 | +import 'dart:convert'; | ||
4 | +export 'package:wow_english/generated/json/product_entity.g.dart'; | ||
5 | + | ||
6 | +@JsonSerializable() | ||
7 | +class ProductEntity { | ||
8 | + | ||
9 | + int? id; | ||
10 | + | ||
11 | + String? name; | ||
12 | + | ||
13 | + String? title; | ||
14 | + | ||
15 | + /// 售卖价格 | ||
16 | + double? price; | ||
17 | + /// 商品图片 | ||
18 | + String? picUrl; | ||
19 | + /// 商品banner图片 | ||
20 | + String? bannerPicUrl; | ||
21 | + /// 商品详情图片 | ||
22 | + String? detailPicUrl; | ||
23 | + /// 销售类型 | ||
24 | + int? saleType; | ||
25 | + /// 状态 | ||
26 | + int? status; | ||
27 | + /// 序号 | ||
28 | + int? sortOrder; | ||
29 | + /// 有效期类型 | ||
30 | + int? validityType; | ||
31 | + | ||
32 | + | ||
33 | + ProductEntity(); | ||
34 | + | ||
35 | + factory ProductEntity.fromJson(Map<String, dynamic> json) => $ProductEntityFromJson(json); | ||
36 | + | ||
37 | + Map<String, dynamic> toJson() => $ProductEntityToJson(this); | ||
38 | + | ||
39 | + @override | ||
40 | + String toString() { | ||
41 | + return jsonEncode(this); | ||
42 | + } | ||
43 | +} | ||
0 | \ No newline at end of file | 44 | \ No newline at end of file |
lib/pages/games/bloc.dart
0 → 100644
1 | +import 'package:bloc/bloc.dart'; | ||
2 | +import 'package:flutter/cupertino.dart'; | ||
3 | +import 'package:flutter/services.dart'; | ||
4 | +import 'package:wow_english/common/extension/string_extension.dart'; | ||
5 | + | ||
6 | +import 'event.dart'; | ||
7 | +import 'game_entity.dart'; | ||
8 | +import 'state.dart'; | ||
9 | + | ||
10 | +class GamesBloc extends Bloc<GamesEvent, GamesState> { | ||
11 | + | ||
12 | + late MethodChannel _methodChannel; | ||
13 | + | ||
14 | + //手动初始化4个GameEntity对象 | ||
15 | + final List<GameEntity> _games = [ | ||
16 | + GameEntity() | ||
17 | + ..id = 1 | ||
18 | + ..imageName = 'pic_module_game'.assetPng | ||
19 | + ..name = '游戏1', | ||
20 | + GameEntity() | ||
21 | + ..id = 2 | ||
22 | + ..imageName = 'pic_module_game'.assetPng | ||
23 | + ..name = '游戏2', | ||
24 | + GameEntity() | ||
25 | + ..id = 3 | ||
26 | + ..imageName = 'pic_module_game'.assetPng | ||
27 | + ..name = '游戏3', | ||
28 | + GameEntity() | ||
29 | + ..id = 4 | ||
30 | + ..imageName = 'pic_module_game'.assetPng | ||
31 | + ..name = '游戏4' | ||
32 | + ]; | ||
33 | + | ||
34 | + List<GameEntity> get listData => _games; | ||
35 | + | ||
36 | + GamesBloc() : super(GamesState().init()) { | ||
37 | + on<InitEvent>(_init); | ||
38 | + on<GotoGamePageEvent>(_gotoGamePage); | ||
39 | + } | ||
40 | + | ||
41 | + void _init(InitEvent event, Emitter<GamesState> emit) async { | ||
42 | + emit(state.clone()); | ||
43 | + } | ||
44 | + | ||
45 | + void _gotoGamePage(GotoGamePageEvent event, Emitter<GamesState> emit) async { | ||
46 | + try { | ||
47 | + _methodChannel = const MethodChannel('wow_english/game_method_channel'); | ||
48 | + await _methodChannel.invokeMethod('openGamePage', { "gameId": event.gameId }); | ||
49 | + } on PlatformException catch (e) { | ||
50 | + debugPrint("Failed to go to native page: '${e.message}'."); | ||
51 | + } | ||
52 | + } | ||
53 | +} |
lib/pages/games/event.dart
0 → 100644
lib/pages/games/game_entity.dart
0 → 100644
lib/pages/games/state.dart
0 → 100644
lib/pages/games/view.dart
0 → 100644
1 | +import 'package:flutter/material.dart'; | ||
2 | +import 'package:flutter_bloc/flutter_bloc.dart'; | ||
3 | + | ||
4 | +import 'package:flutter_screenutil/flutter_screenutil.dart'; | ||
5 | +import 'package:wow_english/common/widgets/we_app_bar.dart'; | ||
6 | +import 'package:wow_english/pages/games/state.dart'; | ||
7 | + | ||
8 | +import '../games/event.dart'; | ||
9 | +import 'bloc.dart'; | ||
10 | + | ||
11 | + | ||
12 | +class GamesPage extends StatelessWidget { | ||
13 | + const GamesPage({super.key}); | ||
14 | + | ||
15 | + @override | ||
16 | + Widget build(BuildContext context) { | ||
17 | + return BlocProvider( | ||
18 | + create: (BuildContext context) => GamesBloc()..add(InitEvent()), | ||
19 | + child: Builder(builder: (context) => _GamesPageView()), | ||
20 | + ); | ||
21 | + } | ||
22 | +} | ||
23 | + | ||
24 | +class _GamesPageView extends StatelessWidget { | ||
25 | + @override | ||
26 | + Widget build(BuildContext context) { | ||
27 | + return BlocListener<GamesBloc, GamesState>( | ||
28 | + listener: (context, state) {}, | ||
29 | + child: Scaffold( | ||
30 | + appBar: const WEAppBar( | ||
31 | + titleText: '游戏专区', | ||
32 | + centerTitle: false, | ||
33 | + ), | ||
34 | + body: _gamesView(), | ||
35 | + ), | ||
36 | + ); | ||
37 | + } | ||
38 | + | ||
39 | + Widget _gamesView() => | ||
40 | + BlocBuilder<GamesBloc, GamesState>(builder: (context, state) { | ||
41 | + final bloc = BlocProvider.of<GamesBloc>(context); | ||
42 | + //屏幕中间横着放四张图片一行展示(尺寸120*200),每张图片下方有行文字 | ||
43 | + return Container( | ||
44 | + margin: EdgeInsets.symmetric(horizontal: 50.0.w), | ||
45 | + child: GridView.builder( | ||
46 | + padding: EdgeInsets.zero, | ||
47 | + // physics: const NeverScrollableScrollPhysics(), | ||
48 | + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( | ||
49 | + crossAxisCount: 3, | ||
50 | + crossAxisSpacing: 10, | ||
51 | + mainAxisSpacing: 10, | ||
52 | + childAspectRatio: 0.6, | ||
53 | + ), | ||
54 | + itemCount: bloc.listData.length, | ||
55 | + itemBuilder: (BuildContext context, int index) { | ||
56 | + final gameEntity = bloc.listData[index]; | ||
57 | + return GestureDetector( | ||
58 | + onTap: () { | ||
59 | + bloc.add(GotoGamePageEvent(gameEntity.id)); | ||
60 | + }, | ||
61 | + child: Column( | ||
62 | + children: [ | ||
63 | + Image.asset(gameEntity.imageName, | ||
64 | + width: 120, height: 200), | ||
65 | + Text(gameEntity.name, | ||
66 | + style: TextStyle( | ||
67 | + fontSize: 14.sp, | ||
68 | + color: const Color(0xFF140C10))) | ||
69 | + ], | ||
70 | + ), | ||
71 | + ); | ||
72 | + })); | ||
73 | + }); | ||
74 | +} |
lib/pages/home/widgets/home_tab_header_widget.dart
@@ -104,14 +104,14 @@ class HomeTabHeaderWidget extends StatelessWidget { | @@ -104,14 +104,14 @@ class HomeTabHeaderWidget extends StatelessWidget { | ||
104 | } | 104 | } |
105 | }, | 105 | }, |
106 | icon: Image.asset('listen'.assetPng)), | 106 | icon: Image.asset('listen'.assetPng)), |
107 | - // IconButton( | ||
108 | - // onPressed: (){ | ||
109 | - // if(actionTap != null) { | ||
110 | - // actionTap!(HeaderActionType.shop); | ||
111 | - // } | ||
112 | - // }, | ||
113 | - // icon: Image.asset('shop'.assetPng) | ||
114 | - // ), | 107 | + IconButton( |
108 | + onPressed: (){ | ||
109 | + if(actionTap != null) { | ||
110 | + actionTap!(HeaderActionType.shop); | ||
111 | + } | ||
112 | + }, | ||
113 | + icon: Image.asset('shop'.assetPng) | ||
114 | + ), | ||
115 | ScreenUtil().bottomBarHeight.horizontalSpace, | 115 | ScreenUtil().bottomBarHeight.horizontalSpace, |
116 | ], | 116 | ], |
117 | ) | 117 | ) |
lib/pages/moduleSelect/bloc.dart
0 → 100644
1 | +import 'package:bloc/bloc.dart'; | ||
2 | + | ||
3 | +import 'event.dart'; | ||
4 | +import 'state.dart'; | ||
5 | + | ||
6 | + | ||
7 | +class ModuleSelectBloc extends Bloc<ModuleSelectEvent, ModuleSelectState> { | ||
8 | + | ||
9 | + ModuleSelectBloc() : super(ModuleSelectState().init()) { | ||
10 | + on<InitEvent>(_init); | ||
11 | + } | ||
12 | + | ||
13 | + void _init(InitEvent event, Emitter<ModuleSelectState> emit) async { | ||
14 | + emit(state.clone()); | ||
15 | + } | ||
16 | +} |
lib/pages/moduleSelect/event.dart
0 → 100644
lib/pages/moduleSelect/state.dart
0 → 100644
lib/pages/moduleSelect/view.dart
0 → 100644
1 | +import 'package:flutter/material.dart'; | ||
2 | +import 'package:flutter_bloc/flutter_bloc.dart'; | ||
3 | +import 'package:wow_english/common/extension/string_extension.dart'; | ||
4 | +import 'package:wow_english/pages/moduleSelect/state.dart'; | ||
5 | +import 'package:wow_english/pages/moduleSelect/widgets/BaseHomeHeaderWidget.dart'; | ||
6 | + | ||
7 | +import 'bloc.dart'; | ||
8 | +import 'event.dart'; | ||
9 | +import 'package:flutter_screenutil/flutter_screenutil.dart'; | ||
10 | +import 'package:wow_english/route/route.dart'; | ||
11 | + | ||
12 | +class ModuleSelectPage extends StatelessWidget { | ||
13 | + const ModuleSelectPage({super.key}); | ||
14 | + | ||
15 | + @override | ||
16 | + Widget build(BuildContext context) { | ||
17 | + return BlocProvider( | ||
18 | + create: (BuildContext context) => ModuleSelectBloc()..add(InitEvent()), | ||
19 | + child: Builder(builder: (context) => _HomePageView()), | ||
20 | + ); | ||
21 | + } | ||
22 | +} | ||
23 | + | ||
24 | +class _HomePageView extends StatelessWidget { | ||
25 | + @override | ||
26 | + Widget build(BuildContext context) { | ||
27 | + final bloc = BlocProvider.of<ModuleSelectBloc>(context); | ||
28 | + return BlocListener<ModuleSelectBloc, ModuleSelectState>( | ||
29 | + listener: (context, state) {}, | ||
30 | + child: _homeView(), | ||
31 | + ); | ||
32 | + } | ||
33 | + | ||
34 | + Widget _homeView() => BlocBuilder<ModuleSelectBloc, ModuleSelectState>( | ||
35 | + builder: (context, state) { | ||
36 | + final bloc = BlocProvider.of<ModuleSelectBloc>(context); | ||
37 | + return Scaffold( | ||
38 | + body: Container( | ||
39 | + color: Colors.white, | ||
40 | + child: Column( | ||
41 | + children: [ | ||
42 | + const BaseHomeHeaderWidget(), | ||
43 | + Expanded( | ||
44 | + child: Center( | ||
45 | + child: Row( | ||
46 | + children: [ | ||
47 | + Expanded( | ||
48 | + child: GestureDetector( | ||
49 | + onTap: () { | ||
50 | + pushNamed(AppRouteName.home); | ||
51 | + }, | ||
52 | + child: Column( | ||
53 | + mainAxisAlignment: MainAxisAlignment.center, | ||
54 | + children: [ | ||
55 | + Stack( | ||
56 | + alignment: AlignmentDirectional.center, | ||
57 | + children: [ | ||
58 | + Image.asset('bg_frame_module'.assetPng, | ||
59 | + width: 162.5.w, height: 203.5.h), | ||
60 | + Center( | ||
61 | + child: Image.asset( | ||
62 | + 'pic_module_study'.assetPng, | ||
63 | + width: 140.5.w, | ||
64 | + height: 172.h), | ||
65 | + ) | ||
66 | + ]), | ||
67 | + 10.verticalSpace, | ||
68 | + Image.asset('label_module_study'.assetPng, | ||
69 | + width: 124.w, height: 34.h), | ||
70 | + ], | ||
71 | + ), | ||
72 | + ), | ||
73 | + ), | ||
74 | + Expanded( | ||
75 | + child: GestureDetector( | ||
76 | + onTap: () { | ||
77 | + pushNamed(AppRouteName.games); | ||
78 | + }, | ||
79 | + child: Column( | ||
80 | + mainAxisAlignment: MainAxisAlignment.center, | ||
81 | + children: [ | ||
82 | + Stack( | ||
83 | + alignment: AlignmentDirectional.center, | ||
84 | + children: [ | ||
85 | + Image.asset('bg_frame_module'.assetPng, | ||
86 | + width: 162.5.w, height: 203.5.h), | ||
87 | + Image.asset('pic_module_game'.assetPng, | ||
88 | + width: 140.5.w, height: 172.h) | ||
89 | + ]), | ||
90 | + 10.verticalSpace, | ||
91 | + Image.asset('label_module_game'.assetPng, | ||
92 | + width: 124.w, height: 34.h), | ||
93 | + ], | ||
94 | + )), | ||
95 | + ), | ||
96 | + ], | ||
97 | + ), | ||
98 | + ), | ||
99 | + ) | ||
100 | + ], | ||
101 | + ), | ||
102 | + ), | ||
103 | + ); | ||
104 | + }); | ||
105 | +} |
lib/pages/moduleSelect/widgets/BaseHomeHeaderWidget.dart
0 → 100644
1 | +import 'package:flutter/material.dart'; | ||
2 | +import 'package:flutter_bloc/flutter_bloc.dart'; | ||
3 | +import 'package:flutter_screenutil/flutter_screenutil.dart'; | ||
4 | +import 'package:wow_english/common/extension/string_extension.dart'; | ||
5 | + | ||
6 | +import '../../../common/core/user_util.dart'; | ||
7 | +import '../../../models/course_entity.dart'; | ||
8 | +import '../../../route/route.dart'; | ||
9 | +import '../../../utils/image_util.dart'; | ||
10 | +import '../../user/bloc/user_bloc.dart'; | ||
11 | + | ||
12 | +class BaseHomeHeaderWidget extends StatelessWidget { | ||
13 | + const BaseHomeHeaderWidget({super.key, this.entity}); | ||
14 | + | ||
15 | + final CourseEntity? entity; | ||
16 | + | ||
17 | + @override | ||
18 | + Widget build(BuildContext context) { | ||
19 | + return BlocBuilder<UserBloc, UserState>( | ||
20 | + builder: (context, state) { | ||
21 | + return Container( | ||
22 | + height: 45, | ||
23 | + width: double.infinity, | ||
24 | + decoration: BoxDecoration( | ||
25 | + image: DecorationImage( | ||
26 | + image: AssetImage('bg_header_sliver'.assetPng), | ||
27 | + fit: BoxFit.cover, | ||
28 | + ), | ||
29 | + ), | ||
30 | + padding: EdgeInsets.symmetric(horizontal: 9.5.w), | ||
31 | + child: Row( | ||
32 | + children: [ | ||
33 | + ScreenUtil().bottomBarHeight.horizontalSpace, | ||
34 | + GestureDetector( | ||
35 | + onTap: () => {onUserClick()}, | ||
36 | + child: Container( | ||
37 | + decoration: BoxDecoration( | ||
38 | + border: Border.all( | ||
39 | + width: 1.0, | ||
40 | + color: const Color(0xFF140C10), | ||
41 | + ), | ||
42 | + borderRadius: BorderRadius.circular(21), | ||
43 | + ), | ||
44 | + child: CircleAvatar( | ||
45 | + radius: 21, | ||
46 | + backgroundImage: ImageUtil.getImageProviderOnDefault( | ||
47 | + UserUtil.getUser()?.avatarUrl), | ||
48 | + ), | ||
49 | + ), | ||
50 | + ), | ||
51 | + GestureDetector( | ||
52 | + onTap: () { | ||
53 | + onUserClick(); | ||
54 | + }, | ||
55 | + child: Container( | ||
56 | + margin: const EdgeInsets.only(left: 7), | ||
57 | + padding: const EdgeInsets.all(4.0), | ||
58 | + decoration: BoxDecoration( | ||
59 | + color: Colors.white, | ||
60 | + borderRadius: BorderRadius.circular(2), | ||
61 | + border: Border.all( | ||
62 | + width: 1.0, | ||
63 | + color: const Color(0xFF140C10), | ||
64 | + style: BorderStyle.solid), | ||
65 | + ), | ||
66 | + child: Text( | ||
67 | + UserUtil.getUser()?.name ?? '未登录', | ||
68 | + style: TextStyle( | ||
69 | + color: const Color(0xFF333333), fontSize: 16.sp), | ||
70 | + ), | ||
71 | + ), | ||
72 | + ), | ||
73 | + 20.horizontalSpace, | ||
74 | + const Expanded( | ||
75 | + child: Text( | ||
76 | + "WOW ENGLISH", | ||
77 | + textAlign: TextAlign.left, | ||
78 | + style: TextStyle(color: Colors.white, fontSize: 30.0), | ||
79 | + )), | ||
80 | + Row(children: <Widget>[ | ||
81 | + Image( | ||
82 | + width: 20.0.w, | ||
83 | + height: 20.0.h, | ||
84 | + image: AssetImage('ic_countdown'.assetPng)), | ||
85 | + // 替换为你的图片资源路径 | ||
86 | + const SizedBox(width: 10.0), | ||
87 | + // 图片和文本之间的间隔 | ||
88 | + const Text('还剩29天'), | ||
89 | + ]), | ||
90 | + ScreenUtil().bottomBarHeight.horizontalSpace, | ||
91 | + ], | ||
92 | + )); | ||
93 | + }, | ||
94 | + ); | ||
95 | + } | ||
96 | +} | ||
97 | + | ||
98 | +void onUserClick() { | ||
99 | + if (UserUtil.token.isEmpty) { | ||
100 | + pushNamed(AppRouteName.login); | ||
101 | + } else { | ||
102 | + pushNamed(AppRouteName.user); | ||
103 | + } | ||
104 | +} |
lib/pages/shop/home/bloc/shop_home_bloc.dart
1 | 1 | ||
2 | import 'package:bloc/bloc.dart'; | 2 | import 'package:bloc/bloc.dart'; |
3 | import 'package:meta/meta.dart'; | 3 | import 'package:meta/meta.dart'; |
4 | +import 'package:wow_english/common/request/dao/shop_dao.dart'; | ||
5 | +import 'package:wow_english/models/product_entity.dart'; | ||
6 | + | ||
7 | +import '../../../../common/request/exception.dart'; | ||
8 | +import '../../../../utils/loading.dart'; | ||
9 | +import '../../../../utils/toast_util.dart'; | ||
4 | 10 | ||
5 | part 'shop_home_event.dart'; | 11 | part 'shop_home_event.dart'; |
6 | part 'shop_home_state.dart'; | 12 | part 'shop_home_state.dart'; |
7 | 13 | ||
8 | class ShopHomeBloc extends Bloc<ShopHomeEvent, ShopHomeState> { | 14 | class ShopHomeBloc extends Bloc<ShopHomeEvent, ShopHomeState> { |
15 | + | ||
16 | + List<ProductEntity?> _productDatas = []; | ||
17 | + | ||
18 | + List<ProductEntity?> get productDatas => _productDatas; | ||
19 | + | ||
9 | ShopHomeBloc() : super(ShopHomeInitial()) { | 20 | ShopHomeBloc() : super(ShopHomeInitial()) { |
10 | on<ShopHomeEvent>((event, emit) { | 21 | on<ShopHomeEvent>((event, emit) { |
11 | // TODO: implement event handler | 22 | // TODO: implement event handler |
12 | }); | 23 | }); |
24 | + on<RequestDataEvent>(_requestData); | ||
25 | + } | ||
26 | + | ||
27 | + void _requestData(RequestDataEvent event, Emitter<ShopHomeState> emitter) async { | ||
28 | + try { | ||
29 | + await loading(() async { | ||
30 | + _productDatas = await ShopDao.productList() ?? []; | ||
31 | + emitter(RequestListenDataState()); | ||
32 | + }); | ||
33 | + } catch (e) { | ||
34 | + if (e is ApiException) { | ||
35 | + showToast(e.message ?? '请求失败,请检查网络连接'); | ||
36 | + } | ||
37 | + } | ||
13 | } | 38 | } |
14 | } | 39 | } |
lib/pages/shop/home/bloc/shop_home_event.dart
lib/pages/shop/home/bloc/shop_home_state.dart
@@ -4,3 +4,5 @@ part of 'shop_home_bloc.dart'; | @@ -4,3 +4,5 @@ part of 'shop_home_bloc.dart'; | ||
4 | abstract class ShopHomeState {} | 4 | abstract class ShopHomeState {} |
5 | 5 | ||
6 | class ShopHomeInitial extends ShopHomeState {} | 6 | class ShopHomeInitial extends ShopHomeState {} |
7 | + | ||
8 | +class RequestListenDataState extends ShopHomeState {} | ||
7 | \ No newline at end of file | 9 | \ No newline at end of file |
lib/pages/shop/home/shop_home_page.dart
@@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart'; | ||
3 | import 'package:flutter_screenutil/flutter_screenutil.dart'; | 3 | import 'package:flutter_screenutil/flutter_screenutil.dart'; |
4 | import 'package:wow_english/common/extension/string_extension.dart'; | 4 | import 'package:wow_english/common/extension/string_extension.dart'; |
5 | import 'package:wow_english/common/widgets/we_app_bar.dart'; | 5 | import 'package:wow_english/common/widgets/we_app_bar.dart'; |
6 | -import 'package:wow_english/pages/shop/home/widgets/lesson_card_item.dart'; | 6 | +import 'package:wow_english/pages/shop/home/widgets/product_item.dart'; |
7 | import 'package:wow_english/route/route.dart'; | 7 | import 'package:wow_english/route/route.dart'; |
8 | import 'package:wow_english/utils/toast_util.dart'; | 8 | import 'package:wow_english/utils/toast_util.dart'; |
9 | 9 | ||
@@ -15,7 +15,7 @@ class ShopHomePage extends StatelessWidget { | @@ -15,7 +15,7 @@ class ShopHomePage extends StatelessWidget { | ||
15 | @override | 15 | @override |
16 | Widget build(BuildContext context) { | 16 | Widget build(BuildContext context) { |
17 | return BlocProvider( | 17 | return BlocProvider( |
18 | - create: (context) => ShopHomeBloc(), | 18 | + create: (context) => ShopHomeBloc()..add(RequestDataEvent()), |
19 | child: _ShopHomeView(), | 19 | child: _ShopHomeView(), |
20 | ); | 20 | ); |
21 | } | 21 | } |
@@ -30,7 +30,9 @@ class _ShopHomeView extends StatelessWidget { | @@ -30,7 +30,9 @@ class _ShopHomeView extends StatelessWidget { | ||
30 | ); | 30 | ); |
31 | } | 31 | } |
32 | 32 | ||
33 | - Widget _shopHomeWidget() => BlocBuilder<ShopHomeBloc, ShopHomeState>(builder: (context, state) { | 33 | + Widget _shopHomeWidget() => |
34 | + BlocBuilder<ShopHomeBloc, ShopHomeState>(builder: (context, state) { | ||
35 | + final bloc = BlocProvider.of<ShopHomeBloc>(context); | ||
34 | return Scaffold( | 36 | return Scaffold( |
35 | appBar: WEAppBar( | 37 | appBar: WEAppBar( |
36 | actions: [ | 38 | actions: [ |
@@ -62,7 +64,7 @@ class _ShopHomeView extends StatelessWidget { | @@ -62,7 +64,7 @@ class _ShopHomeView extends StatelessWidget { | ||
62 | child: Padding( | 64 | child: Padding( |
63 | padding: EdgeInsets.symmetric(vertical: 25.h, horizontal: 25.w), | 65 | padding: EdgeInsets.symmetric(vertical: 25.h, horizontal: 25.w), |
64 | child: GridView.builder( | 66 | child: GridView.builder( |
65 | - itemCount: 4, | 67 | + itemCount: bloc.productDatas.length, |
66 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( | 68 | gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( |
67 | crossAxisCount: 2, | 69 | crossAxisCount: 2, |
68 | childAspectRatio: 2, | 70 | childAspectRatio: 2, |
@@ -70,9 +72,10 @@ class _ShopHomeView extends StatelessWidget { | @@ -70,9 +72,10 @@ class _ShopHomeView extends StatelessWidget { | ||
70 | crossAxisSpacing: 4.5.w, | 72 | crossAxisSpacing: 4.5.w, |
71 | ), | 73 | ), |
72 | itemBuilder: (BuildContext context, int index) { | 74 | itemBuilder: (BuildContext context, int index) { |
73 | - return LessonCardItem(onTap: () { | ||
74 | - showToast('购买'); | ||
75 | - }); | 75 | + final productEntity = bloc.productDatas[index]; |
76 | + return ProductItem(onTap: () { | ||
77 | + pushNamed(AppRouteName.pay, arguments: productEntity); | ||
78 | + }, entity: productEntity); | ||
76 | }), | 79 | }), |
77 | ), | 80 | ), |
78 | ), | 81 | ), |
lib/pages/shop/home/widgets/lesson_card_item.dart renamed to lib/pages/shop/home/widgets/product_item.dart
1 | +import 'package:cached_network_image/cached_network_image.dart'; | ||
1 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
2 | import 'package:flutter_screenutil/flutter_screenutil.dart'; | 3 | import 'package:flutter_screenutil/flutter_screenutil.dart'; |
4 | +import 'package:wow_english/models/product_entity.dart'; | ||
3 | 5 | ||
4 | -class LessonCardItem extends StatelessWidget { | ||
5 | - const LessonCardItem({super.key, required this.onTap}); | 6 | +class ProductItem extends StatelessWidget { |
7 | + const ProductItem({super.key, | ||
8 | + required this.onTap, this.entity}); | ||
9 | + | ||
10 | + final ProductEntity? entity; | ||
6 | 11 | ||
7 | final Function() onTap; | 12 | final Function() onTap; |
8 | 13 | ||
@@ -11,7 +16,6 @@ class LessonCardItem extends StatelessWidget { | @@ -11,7 +16,6 @@ class LessonCardItem extends StatelessWidget { | ||
11 | return Container( | 16 | return Container( |
12 | decoration: BoxDecoration( | 17 | decoration: BoxDecoration( |
13 | borderRadius: BorderRadius.circular(10.r), | 18 | borderRadius: BorderRadius.circular(10.r), |
14 | - color: Colors.blue, | ||
15 | border: Border.all( | 19 | border: Border.all( |
16 | width: 1.0, | 20 | width: 1.0, |
17 | color: Colors.black | 21 | color: Colors.black |
@@ -34,12 +38,29 @@ class LessonCardItem extends StatelessWidget { | @@ -34,12 +38,29 @@ class LessonCardItem extends StatelessWidget { | ||
34 | width: 1.0, | 38 | width: 1.0, |
35 | color: const Color(0xFF333333), | 39 | color: const Color(0xFF333333), |
36 | ), | 40 | ), |
37 | - image: const DecorationImage( | ||
38 | - fit: BoxFit.fill, | ||
39 | - image: NetworkImage('https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fsafe-img.xhscdn.com%2Fbw1%2Faa1c2213-820a-4223-8757-5f8cee318a28%3FimageView2%2F2%2Fw%2F1080%2Fformat%2Fjpg&refer=http%3A%2F%2Fsafe-img.xhscdn.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1688713226&t=192b18a613683bcdc5bd76f65c9ff032'), | 41 | + image: DecorationImage( |
42 | + image: NetworkImage(entity?.picUrl ?? ''), | ||
40 | ) | 43 | ) |
41 | ), | 44 | ), |
42 | ), | 45 | ), |
46 | + // CachedNetworkImage( | ||
47 | + // imageUrl: entity?.picUrl ?? '', | ||
48 | + // fit: BoxFit.fill, | ||
49 | + // imageBuilder: (context, imageProvider) => | ||
50 | + // Container( | ||
51 | + // decoration: BoxDecoration( | ||
52 | + // border: Border.all( | ||
53 | + // width: 1.0, | ||
54 | + // color: const Color(0xFF333333), | ||
55 | + // ), | ||
56 | + // borderRadius: BorderRadius.circular(5.0), | ||
57 | + // ), | ||
58 | + // ), | ||
59 | + // placeholder: (context, url) => const CircularProgressIndicator(), | ||
60 | + // // errorWidget: (context, url, error) => const Icon(Icons.error), | ||
61 | + // height: 124.h, | ||
62 | + // width: 124.w, | ||
63 | + // ), | ||
43 | 21.5.horizontalSpace, | 64 | 21.5.horizontalSpace, |
44 | Expanded( | 65 | Expanded( |
45 | child: Column( | 66 | child: Column( |
@@ -47,7 +68,7 @@ class LessonCardItem extends StatelessWidget { | @@ -47,7 +68,7 @@ class LessonCardItem extends StatelessWidget { | ||
47 | crossAxisAlignment: CrossAxisAlignment.end, | 68 | crossAxisAlignment: CrossAxisAlignment.end, |
48 | children: [ | 69 | children: [ |
49 | Text( | 70 | Text( |
50 | - 'Wow English 课程年卡', | 71 | + entity?.name ?? '', |
51 | softWrap: true, | 72 | softWrap: true, |
52 | textAlign: TextAlign.left, | 73 | textAlign: TextAlign.left, |
53 | style: TextStyle( | 74 | style: TextStyle( |
@@ -66,7 +87,7 @@ class LessonCardItem extends StatelessWidget { | @@ -66,7 +87,7 @@ class LessonCardItem extends StatelessWidget { | ||
66 | ) | 87 | ) |
67 | ), | 88 | ), |
68 | TextSpan( | 89 | TextSpan( |
69 | - text: '998', | 90 | + text: entity?.price?.toString() ?? '', |
70 | style: TextStyle( | 91 | style: TextStyle( |
71 | fontSize: 40.sp, | 92 | fontSize: 40.sp, |
72 | color: const Color(0xFFF51A1A), | 93 | color: const Color(0xFFF51A1A), |
lib/pages/shopping/bloc.dart
0 → 100644
1 | +import 'package:bloc/bloc.dart'; | ||
2 | +import 'package:fluwx/fluwx.dart'; | ||
3 | +import 'package:tobias/tobias.dart'; | ||
4 | +import 'package:wow_english/generated/json/base/json_convert_content.dart'; | ||
5 | +import 'package:wow_english/models/product_entity.dart'; | ||
6 | + | ||
7 | +import '../../common/request/dao/shop_dao.dart'; | ||
8 | +import '../../common/request/exception.dart'; | ||
9 | +import '../../utils/loading.dart'; | ||
10 | +import '../../utils/log_util.dart'; | ||
11 | +import '../../utils/toast_util.dart'; | ||
12 | +import 'event.dart'; | ||
13 | +import 'state.dart'; | ||
14 | + | ||
15 | +class ShoppingBloc extends Bloc<ShoppingEvent, ShoppingState> { | ||
16 | + | ||
17 | + ProductEntity? _productData; | ||
18 | + | ||
19 | + ProductEntity? get productData => _productData; | ||
20 | + | ||
21 | + PaymentChannel _curPaymentChannel = PaymentChannel.wechatPay; | ||
22 | + | ||
23 | + PaymentChannel get curPaymentChannel => _curPaymentChannel; | ||
24 | + | ||
25 | + | ||
26 | + ShoppingBloc(this._productData) : super(ShoppingState().init()) { | ||
27 | + //页面初始化时刻 | ||
28 | + on<InitEvent>(_init); | ||
29 | + on<ChangePaymentChannelEvent>(_changePaymentChannel); | ||
30 | + on<DoPayEvent>(_startPay); | ||
31 | + } | ||
32 | + | ||
33 | + void _init(InitEvent event, Emitter<ShoppingState> emit) async { | ||
34 | + //处理一些初始化操作,然后刷新界面 | ||
35 | + emit(state.clone()); | ||
36 | + } | ||
37 | + | ||
38 | + /// 更换支付渠道 | ||
39 | + void _changePaymentChannel(ChangePaymentChannelEvent event, | ||
40 | + Emitter<ShoppingState> emitter) async { | ||
41 | + Log.d("_curPaymentChannel=$_curPaymentChannel, event.paymentChannel=${event.paymentChannel}"); | ||
42 | + if (_curPaymentChannel != event.paymentChannel) { | ||
43 | + _curPaymentChannel = event.paymentChannel; | ||
44 | + emitter(PaymentChannelChangeState()); | ||
45 | + } | ||
46 | + } | ||
47 | + | ||
48 | + void _startPay(DoPayEvent event, | ||
49 | + Emitter<ShoppingState> emitter) async { | ||
50 | + Log.d("开始支付 ${event.productEntity} ${event.paymentChannel}"); | ||
51 | + //如果event.productEntity为空,中断流程并toast提示 | ||
52 | + if (event.productEntity == null) { | ||
53 | + showToast("商品信息为空"); | ||
54 | + return; | ||
55 | + } | ||
56 | + final productEntitySafely = event.productEntity!; | ||
57 | + try { | ||
58 | + await loading(() async { | ||
59 | + final Map<String, dynamic> orderInfo = await ShopDao.createOrder(productEntitySafely); | ||
60 | + Log.d("orderInfo $orderInfo"); | ||
61 | + final String? orderNo = orderInfo.getOrNull("orderNo"); | ||
62 | + if (orderNo == null) { | ||
63 | + showToast("订单创建失败"); | ||
64 | + return; | ||
65 | + } | ||
66 | + Log.d("orderNo $orderNo"); | ||
67 | + | ||
68 | + if (event.paymentChannel == PaymentChannel.wechatPay) { | ||
69 | + Fluwx fluwx = Fluwx(); | ||
70 | + fluwx.registerApi(appId: "wxd930ea5d5a228f5f", | ||
71 | + universalLink: "https://app-api.wowenglish.com.cn/.well-known/apple-app-site-association"); | ||
72 | + // fluwx.pay( | ||
73 | + // which: Payment( | ||
74 | + // appId: _orderInfo['appid'].toString(), | ||
75 | + // partnerId: _orderInfo['partnerid'].toString(), | ||
76 | + // prepayId: _orderInfo['prepayid'].toString(), | ||
77 | + // packageValue: _orderInfo['package'].toString(), | ||
78 | + // nonceStr: _orderInfo['noncestr'].toString(), | ||
79 | + // timestamp: _orderInfo['timestamp'], | ||
80 | + // sign: _orderInfo['sign'].toString(), | ||
81 | + // )); | ||
82 | + } else { | ||
83 | + final Map<String, dynamic> aliPayOrderInfo = await ShopDao.getAliPayToken(orderNo); | ||
84 | + Log.d("aliPayOrderInfo=$aliPayOrderInfo type=${aliPayOrderInfo.runtimeType}"); | ||
85 | + final String? aliPayInfo = aliPayOrderInfo.getOrNull("token"); | ||
86 | + if (aliPayInfo == null) { | ||
87 | + showToast("支付宝订单创建失败"); | ||
88 | + return; | ||
89 | + } | ||
90 | + Log.d("aliPayInfo=$aliPayInfo"); | ||
91 | + ///打印aliPayOrderInfo的type | ||
92 | + Tobias tobias = Tobias(); | ||
93 | + final Map aliPayResult = await tobias.pay(aliPayInfo); | ||
94 | + Log.d("aliPayResult=$aliPayResult"); | ||
95 | + // 判断resultStatus 为9000则代表支付成功 | ||
96 | + if (aliPayResult.getOrNull("resultStatus") == "9000") { | ||
97 | + showToast("支付成功"); | ||
98 | + emit(PaySuccessState()); | ||
99 | + } else { | ||
100 | + showToast("支付失败"); | ||
101 | + } | ||
102 | + } | ||
103 | + }); | ||
104 | + } catch (e) { | ||
105 | + if (e is ApiException) { | ||
106 | + showToast(e.message ?? '请求失败,请检查网络连接'); | ||
107 | + } | ||
108 | + } | ||
109 | + } | ||
110 | +} | ||
111 | + | ||
112 | +enum PaymentChannel { | ||
113 | + | ||
114 | + wechatPay(1, "微信支付"), | ||
115 | + | ||
116 | + aliPay(2, "支付宝支付"); | ||
117 | + | ||
118 | + const PaymentChannel(this.payChannelType, this.payChannelName); | ||
119 | + | ||
120 | + final int payChannelType; | ||
121 | + | ||
122 | + final String payChannelName; | ||
123 | +} |
lib/pages/shopping/event.dart
0 → 100644
1 | +import 'package:wow_english/models/product_entity.dart'; | ||
2 | + | ||
3 | +import 'bloc.dart'; | ||
4 | + | ||
5 | +abstract class ShoppingEvent {} | ||
6 | + | ||
7 | +class InitEvent extends ShoppingEvent {} | ||
8 | + | ||
9 | +class ChangePaymentChannelEvent extends ShoppingEvent { | ||
10 | + final PaymentChannel paymentChannel; | ||
11 | + | ||
12 | + ChangePaymentChannelEvent(this.paymentChannel); | ||
13 | +} | ||
14 | + | ||
15 | +class DoPayEvent extends ShoppingEvent { | ||
16 | + | ||
17 | + final ProductEntity? productEntity; | ||
18 | + | ||
19 | + final PaymentChannel paymentChannel; | ||
20 | + | ||
21 | + DoPayEvent(this.productEntity, this.paymentChannel); | ||
22 | +} | ||
0 | \ No newline at end of file | 23 | \ No newline at end of file |
lib/pages/shopping/state.dart
0 → 100644
1 | +class ShoppingState { | ||
2 | + ShoppingState init() { | ||
3 | + return ShoppingState(); | ||
4 | + } | ||
5 | + | ||
6 | + ShoppingState clone() { | ||
7 | + return ShoppingState(); | ||
8 | + } | ||
9 | +} | ||
10 | + | ||
11 | +class PaymentChannelChangeState extends ShoppingState {} | ||
12 | + | ||
13 | +class PaySuccessState extends ShoppingState {} | ||
0 | \ No newline at end of file | 14 | \ No newline at end of file |
lib/pages/shopping/view.dart
0 → 100644
1 | +import 'package:cached_network_image/cached_network_image.dart'; | ||
2 | +import 'package:flutter/material.dart'; | ||
3 | +import 'package:flutter_bloc/flutter_bloc.dart'; | ||
4 | +import 'package:flutter_screenutil/flutter_screenutil.dart'; | ||
5 | +import 'package:wow_english/common/extension/string_extension.dart'; | ||
6 | +import 'package:wow_english/models/product_entity.dart'; | ||
7 | + | ||
8 | +import '../../common/core/assets_const.dart'; | ||
9 | +import '../../common/widgets/we_app_bar.dart'; | ||
10 | +import '../../utils/image_util.dart'; | ||
11 | +import '../../utils/log_util.dart'; | ||
12 | +import 'bloc.dart'; | ||
13 | +import 'event.dart'; | ||
14 | +import 'state.dart'; | ||
15 | + | ||
16 | +Widget buildRadioOption({ | ||
17 | + required int value, | ||
18 | + required ImageProvider icon, | ||
19 | + required String text, | ||
20 | + required int groupValue, | ||
21 | + required ValueChanged onChanged, | ||
22 | +}) { | ||
23 | + return Row( | ||
24 | + children: [ | ||
25 | + Image(image: icon, | ||
26 | + width: 20.0.w, | ||
27 | + height: 20.0.h, | ||
28 | + fit: BoxFit.contain), | ||
29 | + const SizedBox(width: 10.0), | ||
30 | + // Expanded( | ||
31 | + // child: Text( | ||
32 | + // text, | ||
33 | + // style: TextStyle(color: Color(0xFF333333), fontSize: 12.5.sp), | ||
34 | + // ), | ||
35 | + // ), | ||
36 | + Text( | ||
37 | + text, | ||
38 | + style: TextStyle(color: Color(0xFF333333), fontSize: 12.5.sp), | ||
39 | + ), | ||
40 | + Radio( | ||
41 | + value: value, | ||
42 | + groupValue: groupValue, | ||
43 | + onChanged: onChanged | ||
44 | + ), | ||
45 | + ], | ||
46 | + ); | ||
47 | +} | ||
48 | + | ||
49 | +class ShoppingPage extends StatelessWidget { | ||
50 | + const ShoppingPage({super.key, this.productEntity}); | ||
51 | + | ||
52 | + final ProductEntity? productEntity; | ||
53 | + | ||
54 | + @override | ||
55 | + Widget build(BuildContext context) { | ||
56 | + return BlocProvider( | ||
57 | + create: (BuildContext context) => | ||
58 | + ShoppingBloc(productEntity) | ||
59 | + ..add(InitEvent()), | ||
60 | + child: _ShoppingView(), | ||
61 | + ); | ||
62 | + } | ||
63 | +} | ||
64 | + | ||
65 | +class _ShoppingView extends StatelessWidget { | ||
66 | + | ||
67 | + @override | ||
68 | + Widget build(BuildContext context) { | ||
69 | + final bloc = BlocProvider.of<ShoppingBloc>(context); | ||
70 | + // var title1 = bloc.productData?.name ?? ''; | ||
71 | + return BlocListener<ShoppingBloc, ShoppingState>( | ||
72 | + listener: (context, state) { | ||
73 | + Log.d("wqf state=$state"); | ||
74 | + if (state is PaySuccessState) { | ||
75 | + Navigator.pop(context); | ||
76 | + } | ||
77 | + }, | ||
78 | + child: Scaffold( | ||
79 | + appBar: const WEAppBar( | ||
80 | + //标题传进来的 | ||
81 | + titleText: "商品详情", | ||
82 | + ), | ||
83 | + body: Container( | ||
84 | + margin: const EdgeInsets.only(left: 80.0, top: 28.0, right: 56.0), | ||
85 | + child: Row( | ||
86 | + crossAxisAlignment: CrossAxisAlignment.start, | ||
87 | + children: [ | ||
88 | + CachedNetworkImage( | ||
89 | + imageUrl: bloc.productData?.detailPicUrl ?? '', | ||
90 | + imageBuilder: (context, imageProvider) => | ||
91 | + Container( | ||
92 | + decoration: BoxDecoration( | ||
93 | + image: DecorationImage( | ||
94 | + image: imageProvider, | ||
95 | + fit: BoxFit.cover, | ||
96 | + ), | ||
97 | + borderRadius: BorderRadius.circular(5.0), | ||
98 | + ), | ||
99 | + ), | ||
100 | + placeholder: (context, url) => const CircularProgressIndicator(), | ||
101 | + // errorWidget: (context, url, error) => const Icon(Icons.error), | ||
102 | + height: 210.0.h, | ||
103 | + width: 210.0.w, | ||
104 | + ), | ||
105 | + const SizedBox(width: 35.5), | ||
106 | + _paymentWidget(), | ||
107 | + ], | ||
108 | + ), | ||
109 | + ), | ||
110 | + ),); | ||
111 | + } | ||
112 | +} | ||
113 | + | ||
114 | +Widget _paymentWidget() => | ||
115 | + BlocBuilder<ShoppingBloc, ShoppingState> | ||
116 | + ( | ||
117 | + builder: (context, state) { | ||
118 | + final bloc = BlocProvider.of<ShoppingBloc>(context); | ||
119 | + return Column( | ||
120 | + crossAxisAlignment: CrossAxisAlignment.start, | ||
121 | + children: [ | ||
122 | + Text('套餐价格:${bloc.productData?.price ?? ''}', | ||
123 | + style: TextStyle( | ||
124 | + color: const Color(0xFF333333), fontSize: 16.sp)), | ||
125 | + const SizedBox(height: 15.0), | ||
126 | + Text('套餐名称:${bloc.productData?.name ?? ''}', | ||
127 | + style: TextStyle( | ||
128 | + color: const Color(0xFF333333), fontSize: 16.sp)), | ||
129 | + const SizedBox(height: 15.0), | ||
130 | + Container( | ||
131 | + padding: | ||
132 | + EdgeInsets.symmetric(horizontal: 6.w, vertical: 10.h), | ||
133 | + decoration: BoxDecoration( | ||
134 | + image: DecorationImage( | ||
135 | + image: ImageUtil.getImageProviderOnDefault( | ||
136 | + AssetsConst.bgUserInformationText), | ||
137 | + fit: BoxFit.fill)), | ||
138 | + child: const Text('支付方式选择', | ||
139 | + style: TextStyle( | ||
140 | + color: Color(0xFF333333), | ||
141 | + fontSize: 12, | ||
142 | + fontFamily: 'PingFangSC-Regular')), | ||
143 | + ), | ||
144 | + const SizedBox(height: 15.0), | ||
145 | + buildRadioOption( | ||
146 | + value: PaymentChannel.wechatPay.payChannelType, | ||
147 | + icon: AssetImage('weixin'.assetPng), | ||
148 | + text: PaymentChannel.wechatPay.payChannelName, | ||
149 | + groupValue: bloc.curPaymentChannel.payChannelType, | ||
150 | + onChanged: (newValue) { | ||
151 | + bloc.add( | ||
152 | + ChangePaymentChannelEvent(PaymentChannel.wechatPay)); | ||
153 | + }, | ||
154 | + ), | ||
155 | + buildRadioOption( | ||
156 | + value: PaymentChannel.aliPay.payChannelType, | ||
157 | + icon: AssetImage('zhifubao'.assetPng), | ||
158 | + text: PaymentChannel.aliPay.payChannelName, | ||
159 | + groupValue: bloc.curPaymentChannel.payChannelType, | ||
160 | + onChanged: (newValue) { | ||
161 | + bloc.add(ChangePaymentChannelEvent(PaymentChannel.aliPay)); | ||
162 | + }, | ||
163 | + ), | ||
164 | + const SizedBox(height: 15.0), | ||
165 | + // 确认支付按钮 | ||
166 | + InkWell( | ||
167 | + onTap: () { | ||
168 | + Log.d('点击支付按钮 ${bloc.productData}'); | ||
169 | + bloc.add(DoPayEvent(bloc.productData, bloc.curPaymentChannel)); | ||
170 | + }, | ||
171 | + child: Image( | ||
172 | + width: 125.w, | ||
173 | + height: 45.h, | ||
174 | + image: AssetImage('btn_pay'.assetPng), | ||
175 | + ), | ||
176 | + ), | ||
177 | + ], | ||
178 | + ); | ||
179 | + }, | ||
180 | + ); |
lib/pages/user/user_page.dart
@@ -142,18 +142,18 @@ class _UserView extends StatelessWidget { | @@ -142,18 +142,18 @@ class _UserView extends StatelessWidget { | ||
142 | ], | 142 | ], |
143 | ), | 143 | ), |
144 | 30.verticalSpace, | 144 | 30.verticalSpace, |
145 | - // todo xiaoyu delete 打开游戏界面 | ||
146 | - OutlinedButton( | 145 | + // 打开游戏界面 供审核用 |
146 | + ((UserUtil.getUser()?.phoneNum == '17730280759' || UserUtil.getUser()?.phoneNum == '17718485544') ? OutlinedButton( | ||
147 | onPressed: () { | 147 | onPressed: () { |
148 | - methodChannel.invokeMethod('openGamePage', {}); | 148 | + methodChannel.invokeMethod('openGamePage', { "gameId": 1 }); |
149 | }, | 149 | }, |
150 | style: normalButtonStyle, | 150 | style: normalButtonStyle, |
151 | child: Text( | 151 | child: Text( |
152 | - "打开游戏界面", | 152 | + "进入游戏", |
153 | style: textStyle21sp, | 153 | style: textStyle21sp, |
154 | ), | 154 | ), |
155 | - ), | ||
156 | - 12.verticalSpace, | 155 | + ) : 1.verticalSpace), |
156 | + ((UserUtil.getUser()?.phoneNum == '17730280759' || UserUtil.getUser()?.phoneNum == '17718485544') ? 12.verticalSpace : 1.verticalSpace), | ||
157 | OutlinedButton( | 157 | OutlinedButton( |
158 | onPressed: () => pushNamed(AppRouteName.fogPwd), | 158 | onPressed: () => pushNamed(AppRouteName.fogPwd), |
159 | style: normalButtonStyle, | 159 | style: normalButtonStyle, |
lib/route/route.dart
@@ -2,12 +2,15 @@ import 'package:flutter/cupertino.dart'; | @@ -2,12 +2,15 @@ import 'package:flutter/cupertino.dart'; | ||
2 | import 'package:flutter/material.dart'; | 2 | import 'package:flutter/material.dart'; |
3 | import 'package:wow_english/app/splash_page.dart'; | 3 | import 'package:wow_english/app/splash_page.dart'; |
4 | import 'package:wow_english/common/pages/wow_web_page.dart'; | 4 | import 'package:wow_english/common/pages/wow_web_page.dart'; |
5 | +import 'package:wow_english/models/product_entity.dart'; | ||
6 | +import 'package:wow_english/pages/games/view.dart'; | ||
5 | import 'package:wow_english/pages/home/home_page.dart'; | 7 | import 'package:wow_english/pages/home/home_page.dart'; |
6 | import 'package:wow_english/pages/lessons/lesson_page.dart'; | 8 | import 'package:wow_english/pages/lessons/lesson_page.dart'; |
7 | import 'package:wow_english/pages/listen/listen_page.dart'; | 9 | import 'package:wow_english/pages/listen/listen_page.dart'; |
8 | import 'package:wow_english/pages/login/forgetpwd/forget_password_home_page.dart'; | 10 | import 'package:wow_english/pages/login/forgetpwd/forget_password_home_page.dart'; |
9 | import 'package:wow_english/pages/login/loginpage/login_page.dart'; | 11 | import 'package:wow_english/pages/login/loginpage/login_page.dart'; |
10 | import 'package:wow_english/pages/login/setpwd/set_pwd_page.dart'; | 12 | import 'package:wow_english/pages/login/setpwd/set_pwd_page.dart'; |
13 | +import 'package:wow_english/pages/moduleSelect/view.dart'; | ||
11 | import 'package:wow_english/pages/practice/topic_picture_page.dart'; | 14 | import 'package:wow_english/pages/practice/topic_picture_page.dart'; |
12 | import 'package:wow_english/pages/repeatafter/repeat_after_page.dart'; | 15 | import 'package:wow_english/pages/repeatafter/repeat_after_page.dart'; |
13 | import 'package:wow_english/pages/repeataftercontent/repeat_after_content_page.dart'; | 16 | import 'package:wow_english/pages/repeataftercontent/repeat_after_content_page.dart'; |
@@ -23,12 +26,16 @@ import 'package:wow_english/pages/user/user_page.dart'; | @@ -23,12 +26,16 @@ import 'package:wow_english/pages/user/user_page.dart'; | ||
23 | import 'package:wow_english/pages/video/lookvideo/look_video_page.dart'; | 26 | import 'package:wow_english/pages/video/lookvideo/look_video_page.dart'; |
24 | 27 | ||
25 | import '../pages/reading/reading_page.dart'; | 28 | import '../pages/reading/reading_page.dart'; |
29 | +import '../pages/shopping/view.dart'; | ||
26 | import '../pages/user/setting/delete_account_page.dart'; | 30 | import '../pages/user/setting/delete_account_page.dart'; |
27 | import '../pages/user/setting/reback_page.dart'; | 31 | import '../pages/user/setting/reback_page.dart'; |
32 | +import '../utils/log_util.dart'; | ||
28 | 33 | ||
29 | class AppRouteName { | 34 | class AppRouteName { |
30 | static const String splash = 'splash'; | 35 | static const String splash = 'splash'; |
31 | static const String login = 'login'; | 36 | static const String login = 'login'; |
37 | + static const String moduleSelect = 'moduleSelect'; | ||
38 | + static const String games = 'games'; | ||
32 | static const String home = 'home'; | 39 | static const String home = 'home'; |
33 | static const String fogPwd = 'fogPwd'; | 40 | static const String fogPwd = 'fogPwd'; |
34 | 41 | ||
@@ -43,6 +50,7 @@ class AppRouteName { | @@ -43,6 +50,7 @@ class AppRouteName { | ||
43 | static const String reAfter = 'reAfter'; | 50 | static const String reAfter = 'reAfter'; |
44 | static const String topicPic = 'topicPic'; | 51 | static const String topicPic = 'topicPic'; |
45 | static const String user = 'user'; | 52 | static const String user = 'user'; |
53 | + static const String pay = 'pay'; | ||
46 | 54 | ||
47 | /// 用户详细信息页 | 55 | /// 用户详细信息页 |
48 | static const String userInformation = 'userInformation'; | 56 | static const String userInformation = 'userInformation'; |
@@ -84,6 +92,10 @@ class AppRouter { | @@ -84,6 +92,10 @@ class AppRouter { | ||
84 | transitionsBuilder: (_, __, ___, child) => child); | 92 | transitionsBuilder: (_, __, ___, child) => child); |
85 | case AppRouteName.login: | 93 | case AppRouteName.login: |
86 | return CupertinoPageRoute(builder: (_) => const LoginPage()); | 94 | return CupertinoPageRoute(builder: (_) => const LoginPage()); |
95 | + case AppRouteName.moduleSelect: | ||
96 | + return CupertinoPageRoute(builder: (_) => const ModuleSelectPage()); | ||
97 | + case AppRouteName.games: | ||
98 | + return CupertinoPageRoute(builder: (_) => const GamesPage()); | ||
87 | case AppRouteName.home: | 99 | case AppRouteName.home: |
88 | var moduleId = ''; | 100 | var moduleId = ''; |
89 | if (settings.arguments != null) { | 101 | if (settings.arguments != null) { |
@@ -101,6 +113,12 @@ class AppRouter { | @@ -101,6 +113,12 @@ class AppRouter { | ||
101 | return CupertinoPageRoute(builder: (_) => const ListenPage()); | 113 | return CupertinoPageRoute(builder: (_) => const ListenPage()); |
102 | case AppRouteName.shop: | 114 | case AppRouteName.shop: |
103 | return CupertinoPageRoute(builder: (_) => const ShopHomePage()); | 115 | return CupertinoPageRoute(builder: (_) => const ShopHomePage()); |
116 | + case AppRouteName.pay: | ||
117 | + var productEntity = ProductEntity(); | ||
118 | + if (settings.arguments != null && settings.arguments is ProductEntity) { | ||
119 | + productEntity = settings.arguments as ProductEntity; | ||
120 | + } | ||
121 | + return CupertinoPageRoute(builder: (_) => ShoppingPage(productEntity: productEntity)); | ||
104 | case AppRouteName.exLesson: | 122 | case AppRouteName.exLesson: |
105 | return CupertinoPageRoute(builder: (_) => const ExchangeLessonPage()); | 123 | return CupertinoPageRoute(builder: (_) => const ExchangeLessonPage()); |
106 | case AppRouteName.exList: | 124 | case AppRouteName.exList: |
pubspec.yaml
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev | @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev | ||
16 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | 16 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html |
17 | # In Windows, build-name is used as the major, minor, and patch parts | 17 | # In Windows, build-name is used as the major, minor, and patch parts |
18 | # of the product and file versions while build-number is used as the build suffix. | 18 | # of the product and file versions while build-number is used as the build suffix. |
19 | -version: 1.0.2+1 | 19 | +version: 1.0.3+2 |
20 | 20 | ||
21 | environment: | 21 | environment: |
22 | sdk: '>=3.0.0 <4.0.0' | 22 | sdk: '>=3.0.0 <4.0.0' |
@@ -66,15 +66,17 @@ dependencies: | @@ -66,15 +66,17 @@ dependencies: | ||
66 | # 拍照,从相册中选择 https://pub.flutter-io.cn/packages/image_picker | 66 | # 拍照,从相册中选择 https://pub.flutter-io.cn/packages/image_picker |
67 | image_picker: ^0.8.7+5 | 67 | image_picker: ^0.8.7+5 |
68 | # 支付宝支付SDK https://pub.flutter-io.cn/packages/tobias | 68 | # 支付宝支付SDK https://pub.flutter-io.cn/packages/tobias |
69 | - # tobias: ^3.1.0 | 69 | + tobias: ^3.3.2 |
70 | # 微信SDK相关 https://pub.flutter-io.cn/packages/fluwx | 70 | # 微信SDK相关 https://pub.flutter-io.cn/packages/fluwx |
71 | - # fluwx: ^4.2.4+1 | 71 | + fluwx: ^4.5.5 |
72 | # json数据解析 https://pub.flutter-io.cn/packages/json_annotation | 72 | # json数据解析 https://pub.flutter-io.cn/packages/json_annotation |
73 | json_annotation: ^4.8.1 | 73 | json_annotation: ^4.8.1 |
74 | # double丢失精度问题 https://pub.dev/packages/decimal | 74 | # double丢失精度问题 https://pub.dev/packages/decimal |
75 | decimal: ^2.3.2 | 75 | decimal: ^2.3.2 |
76 | # 网络图片缓存 https://pub.flutter-io.cn/packages/cached_network_image | 76 | # 网络图片缓存 https://pub.flutter-io.cn/packages/cached_network_image |
77 | - cached_network_image: ^3.2.3 | 77 | + cached_network_image: ^3.3.1 |
78 | +# # 网络图片缓存 https://pub.dev/packages/extended_image | ||
79 | +# extended_image: ^4.0.0 | ||
78 | # 常用工具类(时间轴,倒计时等) https://pub.flutter-io.cn/packages/common_utils | 80 | # 常用工具类(时间轴,倒计时等) https://pub.flutter-io.cn/packages/common_utils |
79 | common_utils: ^2.1.0 | 81 | common_utils: ^2.1.0 |
80 | # 获取设备信息 https://pub.flutter-io.cn/packages/device_info_plus | 82 | # 获取设备信息 https://pub.flutter-io.cn/packages/device_info_plus |
@@ -135,3 +137,8 @@ flutter: | @@ -135,3 +137,8 @@ flutter: | ||
135 | - family: HannotateSC | 137 | - family: HannotateSC |
136 | fonts: | 138 | fonts: |
137 | - asset: assets/fonts/HannotateSC-W5.ttf | 139 | - asset: assets/fonts/HannotateSC-W5.ttf |
140 | + | ||
141 | +tobias: | ||
142 | + url_scheme: ishowwoweng | ||
143 | + ios: | ||
144 | + ignore_security: true |