1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//
// ViewModel.swift
// BreastFeedingDemo
//
// Created by Jay Zhang on 2022/6/5.
//
import Flutter
import FlutterPluginRegistrant
import Foundation
class ViewModel {
enum Posture: Int {
case cradle = 0
case lying = 1
}
/// 语言枚举,enum代表语言包文件名,rawValue代表语言选项
enum Language: String, CaseIterable {
case english = "English"
case french = "Français"
case spanish = "Español"
}
var env: String = "testing"
var apiKey: String = "DLAB-customername-12345687"
var region: String = "apac"
var language: Language = .english {
didSet {
setupText()
}
}
var flutterEngine: FlutterEngine!
var posture: Posture = .cradle
var string: StringModel!
var isFirstLoad: Bool = true
var languagePack: [String: Any] {
let languageFile = "\(language)".appending(".json")
let path: String = Bundle.main.path(forResource: languageFile, ofType: nil)!
let nsUrl = URL(fileURLWithPath: path)
let nsData = try! Data(contentsOf: nsUrl)
let json = try! JSONSerialization.jsonObject(with: nsData) as! [String: Any]
return json
}
var flutterArguments: String {
let arguments: [String: Any] = [
"lying": posture.rawValue,
"languagePack": languagePack,
"env": env,
"apiKey": apiKey,
"region": region,
]
let data = try? JSONSerialization.data(withJSONObject: arguments, options: [])
let str = String(data: data!, encoding: String.Encoding.utf8)
return str!
}
var methodChannel: FlutterMethodChannel!
var completeHandler: (() -> Void)?
var teachingEndHandler: (() -> Void)?
init() {
language = .english
setupText()
runFlutterEngine()
methodChannel = setupMethodCallHandler()
}
func runFlutterEngine() {
flutterEngine = FlutterEngine(name: "my flutter engine")
flutterEngine.run()
GeneratedPluginRegistrant.register(with: flutterEngine)
}
func setupMethodCallHandler() -> FlutterMethodChannel {
let binaryMessenger = flutterEngine.binaryMessenger
let methodChannel = FlutterMethodChannel(name: "com.wmdigit.breastcoachai.native", binaryMessenger: binaryMessenger)
methodChannel.setMethodCallHandler { [weak self]
(call: FlutterMethodCall, result: @escaping FlutterResult) in
if let self = self {
switch call.method {
case "init":
let params = self.initLanguagePack() // 生成JSON格式的语言包
result(params) // 初始化
case "teachingEnd":
self.methodChannel.invokeMethod("dispose", arguments: nil)
// ["totalDuration": 3, "reasonText": Concern about my personal privacy, "status": incomplete, "incompleteReasonCode": 2]
let argument: [String: Any] = try! JSONSerialization.jsonObject(with: (call.arguments as! String).data(using: .utf8)!) as! [String: Any]
let status: String = argument["status"] as! String
if status == "complete" {
self.completeHandler?()
return
}
self.teachingEndHandler?()
default:
// Unrecognized method name
print("Unrecognized method name: \(call.method)")
}
}
}
return methodChannel
}
fileprivate func initLanguagePack() -> String {
return viewModel.flutterArguments
}
fileprivate func setupText() {
let languageFile = "string_\(language)".appending(".json")
let path: String = Bundle.main.path(forResource: languageFile, ofType: nil)!
let nsUrl = URL(fileURLWithPath: path)
let nsData = try! Data(contentsOf: nsUrl)
let json = try! JSONSerialization.jsonObject(with: nsData) as! [String: Any]
string = .init(fromDictionary: json)
}
}