--- title: TB App tags: App image: https://i.imgur.com/ARA4eoQ.png --- # TB App :::info ThingsBoard 行動端 App 採用 Flutter,除了 Web, 支持 Android 和 iOS。 對岸實測評價,佳! ::: [toc] ## 準備工作 :::info * Host: Windows 10 Pro * VirtualBox 6.1 Ubuntu Desktop 20.04 VM (4vCPU, 4G Mem) ::: ### Flutter 環境 官方文件: https://flutter.dev/ Setup Guide | [Linux](https://flutter.io/setup-linux) | [macOS](https://flutter.io/setup-macos) | [Windows](https://flutter.io/setup-windows) | ### Install Flutter & Android Studio using snapd ```bash= star@tb-app:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=20.04 DISTRIB_CODENAME=focal DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS" star@tb-app:~$ sudo apt install -y snapd [sudo] password for star: Reading package lists... Done Building dependency tree Reading state information... Done snapd is already the newest version (2.51.1+20.04ubuntu2). snapd set to manually installed. 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. star@tb-app:~$ snap version snap 2.52.1 snapd 2.52.1 series 16 ubuntu 20.04 kernel 5.11.0-38-generic star@tb-app:~$ sudo snap install flutter --classic flutter 0+git.8cbec5c from Flutter Team✓ installed star@tb-app:~$ flutter sdk-path Initializing Flutter % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 136k 100 136k 0 0 377k 0 --:--:-- --:--:-- --:--:-- 376k Downloading https://storage.googleapis.com/flutter_infra/releases/stable/linux/flutter_linux_2.2.1-stable.tar.xz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 573M 100 573M 0 0 9498k 0 0:01:01 0:01:01 --:--:-- 9660k Flutter initialized ╔════════════════════════════════════════════════════════════════════════════╗ ║ A new version of Flutter is available! ║ ║ ║ ║ To update to the latest version, run "flutter upgrade". ║ ╚════════════════════════════════════════════════════════════════════════════╝ Flutter 2.2.1 • channel stable • https://github.com/flutter/flutter.git Framework • revision 02c026b03c (5 months ago) • 2021-05-27 12:24:44 -0700 Engine • revision 0fdb562ac8 Tools • Dart 2.13.1 ╔════════════════════════════════════════════════════════════════════════════╗ ║ Welcome to Flutter! - https://flutter.dev ║ ║ ║ ║ The Flutter tool uses Google Analytics to anonymously report feature usage ║ ║ statistics and basic crash reports. This data is used to help improve ║ ║ Flutter tools over time. ║ ║ ║ ║ Flutter tool analytics are not sent on the very first run. To disable ║ ║ reporting, type 'flutter config --no-analytics'. To display the current ║ ║ setting, type 'flutter config'. If you opt out of analytics, an opt-out ║ ║ event will be sent, and then no further information will be sent by the ║ ║ Flutter tool. ║ ║ ║ ║ By downloading the Flutter SDK, you agree to the Google Terms of Service. ║ ║ Note: The Google Privacy Policy describes how data is handled in this ║ ║ service. ║ ║ ║ ║ Moreover, Flutter includes the Dart SDK, which may send usage metrics and ║ ║ crash reports to Google. ║ ║ ║ ║ Read about data we send with crash reports: ║ ║ https://flutter.dev/docs/reference/crash-reporting ║ ║ ║ ║ See Google's privacy policy: ║ ║ https://policies.google.com/privacy ║ ╚════════════════════════════════════════════════════════════════════════════╝ /home/star/snap/flutter/common/flutter star@tb-app:~$ flutter doctor Running "flutter pub get" in flutter_tools... 8.2s Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 2.2.1, on Linux, locale en_US.UTF-8) [✗] Android toolchain - develop for Android devices ✗ Unable to locate Android SDK. Install Android Studio from: https://developer.android.com/studio/index.html On first launch it will assist you in installing the Android SDK components. (or visit https://flutter.dev/docs/get-started/install/linux#android-setup for detailed instructions). If the Android SDK has been installed to a custom location, please use `flutter config --android-sdk` to update to that location. [✗] Chrome - develop for the web (Cannot find Chrome executable at google-chrome) ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable. [!] Android Studio (not installed) [!] Connected device ! No devices available ! Doctor found issues in 4 categories. star@tb-app:~$ sudo snap install android-studio --classic [sudo] password for star: android-studio 2020.3.1.24 from Snapcrafters installed star@tb-app:~$ sudo snap list android-studio Name Version Rev Tracking Publisher Notes android-studio 2020.3.1.24 115 latest/stable snapcrafters classic star@tb-app:~$ android-studio // run flutter doctor in another terminal tab after initializing android studio (do not need to import config) star@tb-app:~$ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 2.2.1, on Linux, locale en_US.UTF-8) [!] Android toolchain - develop for Android devices (Android SDK version 31.0.0) ✗ Android license status unknown. Run `flutter doctor --android-licenses` to accept the SDK licenses. See https://flutter.dev/docs/get-started/install/linux#android-setup for more details. [✗] Chrome - develop for the web (Cannot find Chrome executable at google-chrome) ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable. [✓] Android Studio (version 2020.3) [!] Connected device ! No devices available star@tb-app:~$ flutter doctor --android-licenses Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156) at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75) at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 5 more star@tb-app:~$ flutter doctor --android-licenses Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156) at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75) at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:73) at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48) Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ... 5 more ``` > 打開 Android Studio 的 Tools > SDK Manager > Appearance & Behavior > System Settings > Android SDK > SDK Tools > Android SDK Command-line tools,接著選擇 Apply 按鈕。 ![](https://i.imgur.com/wtaXv5W.png) > 回到終端機,再次執行 flutter doctor --android licenses,就能成功繼續配置環境。 ```bash= star@tb-app:~$ flutter doctor --android-licenses 5 of 6 SDK package licenses not accepted. 100% Computing updates... Review licenses that have not been accepted (y/N)? y ... ... ... Accept? (y/N): y All SDK package licenses accepted star@tb-app:~$ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 2.2.1, on Linux, locale en_US.UTF-8) [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) [✗] Chrome - develop for the web (Cannot find Chrome executable at google-chrome) ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable. [✓] Android Studio (version 2020.3) [!] Connected device ! No devices available ! Doctor found issues in 2 categories. star@tb-app:~/workspace/download$ wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb star@tb-app:~/workspace/download$ sudo dpkg -i google-chrome-stable_current_amd64.deb star@tb-app:~/workspace/download$ flutter doctor Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 2.2.1, on Linux, locale en_US.UTF-8) [✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) [✓] Chrome - develop for the web [✓] Android Studio (version 2020.3) [✓] Connected device (1 available) • No issues found! ``` * Download ThingsBoard Flutter App repository ```bash= sudo apt install git git clone https://github.com/thingsboard/flutter_thingsboard_app.git ``` ### iOS (待驗證) 需要一台等級好一點 macOS 電腦,安裝相關開發軟體。 ## Repository ```bash= flutter_thingsboard_app/ ├── android │ ├── app │ ├── build.gradle │ ├── gradle │ ├── gradle.properties │ ├── settings_aar.gradle │ └── settings.gradle ├── assets │ └── images ├── ios │ ├── Flutter │ ├── Podfile │ ├── Podfile.lock │ ├── Runner │ ├── Runner.xcodeproj │ └── Runner.xcworkspace ├── lib │ ├── config │ ├── constants │ ├── core │ ├── main.dart │ ├── modules │ ├── utils │ └── widgets ├── LICENSE ├── pubspec.lock ├── pubspec.yaml ├── README.md └── test └── widget_test.dart 18 directories, 12 files ``` ### 自訂伺服器位置 ./lib/constants/app_constants.dart (==請將 thingsBoardApiEndpoint 指向自家 TB==) ```kotlin= abstract class ThingsboardAppConstants { static final thingsBoardApiEndpoint = 'http://localhost:8080'; static final thingsboardOAuth2CallbackUrlScheme = 'org.thingsboard.app.auth'; /// Not for production (only for debugging) static final thingsboardOAuth2AppSecret = 'Your app secret here'; } ``` ### 介面中文化 所有 Dart 文件 e.g. 修改密碼頁面,將 string 訊息改成中文即可。 ./lib/modules/profile/change_password_page.dart, ### 編譯 ``` flutter build apk ``` ![](https://i.imgur.com/wmKzcPf.png) ``` flutter build apk --no-tree-shake-icons 💪 Building with sound null safety 💪 Note: Some input files use or override a deprecated API. Note: Recompile with -Xlint:deprecation for details. Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. Note: /home/star/snap/flutter/common/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_secure_storage-4.2.1/android/src/main/java/com/it_nomads/fluttersecurestorage/FlutterSecureStoragePlugin.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. WARNING: [Processor] Library '/home/star/.gradle/caches/modules-2/files-2.1/org.robolectric/shadows-framework/4.3.1/da048a93951f4d9e46519749c53b0f868dfdf425/shadows-framework-4.3.1.jar' contains references to both AndroidX and old support library. This seems like the library is partially migrated. Jetifier will try to rewrite the library anyway. Example of androidX reference: 'androidx/test/runner/lifecycle/Stage' Example of support library reference: 'android/support/annotation/NonNull' WARNING: [Processor] Library '/home/star/.gradle/caches/modules-2/files-2.1/org.robolectric/shadows-framework/4.3/150103d5732c432906f6130b734e7452855dd67b/shadows-framework-4.3.jar' contains references to both AndroidX and old support library. This seems like the library is partially migrated. Jetifier will try to rewrite the library anyway. Example of androidX reference: 'androidx/test/runner/lifecycle/Stage' Example of support library reference: 'android/support/annotation/NonNull' Running Gradle task 'assembleRelease'... Running Gradle task 'assembleRelease'... Done 229.6s ✓ Built build/app/outputs/flutter-apk/app-release.apk (22.9MB). ``` * build/app/outputs/flutter-apk/app-release.apk, 編譯後的apk檔,直接安裝於 Android 手機,即可使用。 ![](https://i.imgur.com/ARA4eoQ.png) ## Reference(s) * https://yiqisoft.cn/blog/category/client-side/