From 02b3da2ee34dc7b5e897189bd13d64926f7b681f Mon Sep 17 00:00:00 2001 From: tanlongsheng <252620078@qq.com> Date: Fri, 11 Apr 2025 18:29:20 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=AB=98=E5=BE=B7?= =?UTF-8?q?=E5=AE=9A=E4=BD=8Dsdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- amap_flutter/.gitignore | 33 ++++ amap_flutter/.metadata | 33 ++++ amap_flutter/CHANGELOG.md | 3 + amap_flutter/LICENSE | 1 + amap_flutter/README.md | 15 ++ amap_flutter/analysis_options.yaml | 4 + amap_flutter/android/.gitignore | 9 + amap_flutter/android/build.gradle | 54 ++++++ amap_flutter/android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../amap_flutter/AmapFlutterPlugin.java | 168 ++++++++++++++++++ amap_flutter/ios/.gitignore | 38 ++++ amap_flutter/ios/Assets/.gitkeep | 0 .../ios/Classes/AmapFlutterPlugin.swift | 19 ++ .../ios/Resources/PrivacyInfo.xcprivacy | 14 ++ amap_flutter/ios/amap_flutter.podspec | 29 +++ amap_flutter/lib/amap_flutter.dart | 36 ++++ .../lib/amap_flutter_method_channel.dart | 45 +++++ .../lib/amap_flutter_platform_interface.dart | 49 +++++ amap_flutter/pubspec.yaml | 72 ++++++++ android/app/src/main/AndroidManifest.xml | 8 +- .../meeting_record_controller.dart | 20 ++- .../meeting/views/meeting_details_view.dart | 19 +- .../meeting/views/meeting_edit_view.dart | 15 +- .../meeting/views/meeting_record_view.dart | 15 +- .../splash/controllers/splash_controller.dart | 5 + pubspec.yaml | 2 + 27 files changed, 690 insertions(+), 20 deletions(-) create mode 100644 amap_flutter/.gitignore create mode 100644 amap_flutter/.metadata create mode 100644 amap_flutter/CHANGELOG.md create mode 100644 amap_flutter/LICENSE create mode 100644 amap_flutter/README.md create mode 100644 amap_flutter/analysis_options.yaml create mode 100644 amap_flutter/android/.gitignore create mode 100644 amap_flutter/android/build.gradle create mode 100644 amap_flutter/android/settings.gradle create mode 100644 amap_flutter/android/src/main/AndroidManifest.xml create mode 100644 amap_flutter/android/src/main/java/com/example/amap_flutter/AmapFlutterPlugin.java create mode 100644 amap_flutter/ios/.gitignore create mode 100644 amap_flutter/ios/Assets/.gitkeep create mode 100644 amap_flutter/ios/Classes/AmapFlutterPlugin.swift create mode 100644 amap_flutter/ios/Resources/PrivacyInfo.xcprivacy create mode 100644 amap_flutter/ios/amap_flutter.podspec create mode 100644 amap_flutter/lib/amap_flutter.dart create mode 100644 amap_flutter/lib/amap_flutter_method_channel.dart create mode 100644 amap_flutter/lib/amap_flutter_platform_interface.dart create mode 100644 amap_flutter/pubspec.yaml diff --git a/amap_flutter/.gitignore b/amap_flutter/.gitignore new file mode 100644 index 000000000..e7d347d9d --- /dev/null +++ b/amap_flutter/.gitignore @@ -0,0 +1,33 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.build/ +.buildlog/ +.history +.svn/ +.swiftpm/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +build/ diff --git a/amap_flutter/.metadata b/amap_flutter/.metadata new file mode 100644 index 000000000..a5700b901 --- /dev/null +++ b/amap_flutter/.metadata @@ -0,0 +1,33 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "35c388afb57ef061d06a39b537336c87e0e3d1b1" + channel: "stable" + +project_type: plugin + +# Tracks metadata for the flutter migrate command +migration: + platforms: + - platform: root + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + - platform: android + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + - platform: ios + create_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + base_revision: 35c388afb57ef061d06a39b537336c87e0e3d1b1 + + # User provided section + + # List of Local paths (relative to this file) that should be + # ignored by the migrate tool. + # + # Files that are not part of the templates will be ignored by default. + unmanaged_files: + - 'lib/main.dart' + - 'ios/Runner.xcodeproj/project.pbxproj' diff --git a/amap_flutter/CHANGELOG.md b/amap_flutter/CHANGELOG.md new file mode 100644 index 000000000..41cc7d819 --- /dev/null +++ b/amap_flutter/CHANGELOG.md @@ -0,0 +1,3 @@ +## 0.0.1 + +* TODO: Describe initial release. diff --git a/amap_flutter/LICENSE b/amap_flutter/LICENSE new file mode 100644 index 000000000..ba75c69f7 --- /dev/null +++ b/amap_flutter/LICENSE @@ -0,0 +1 @@ +TODO: Add your license here. diff --git a/amap_flutter/README.md b/amap_flutter/README.md new file mode 100644 index 000000000..8ad963d6d --- /dev/null +++ b/amap_flutter/README.md @@ -0,0 +1,15 @@ +# amap_flutter + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter +[plug-in package](https://flutter.dev/to/develop-plugins), +a specialized package that includes platform-specific implementation code for +Android and/or iOS. + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev), which offers tutorials, +samples, guidance on mobile development, and a full API reference. + diff --git a/amap_flutter/analysis_options.yaml b/amap_flutter/analysis_options.yaml new file mode 100644 index 000000000..a5744c1cf --- /dev/null +++ b/amap_flutter/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/amap_flutter/android/.gitignore b/amap_flutter/android/.gitignore new file mode 100644 index 000000000..161bdcdaf --- /dev/null +++ b/amap_flutter/android/.gitignore @@ -0,0 +1,9 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures +.cxx diff --git a/amap_flutter/android/build.gradle b/amap_flutter/android/build.gradle new file mode 100644 index 000000000..6b87067f5 --- /dev/null +++ b/amap_flutter/android/build.gradle @@ -0,0 +1,54 @@ +group = "com.example.amap_flutter" +version = "1.0" + +buildscript { + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.7.0") + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: "com.android.library" + +android { + namespace = "com.example.amap_flutter" + + compileSdk = 35 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + defaultConfig { + minSdk = 21 + } + + dependencies { + implementation 'com.amap.api:location:6.4.9' + + testImplementation("junit:junit:4.13.2") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen {false} + showStandardStreams = true + } + } + } +} diff --git a/amap_flutter/android/settings.gradle b/amap_flutter/android/settings.gradle new file mode 100644 index 000000000..5f1ba0ee8 --- /dev/null +++ b/amap_flutter/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'amap_flutter' diff --git a/amap_flutter/android/src/main/AndroidManifest.xml b/amap_flutter/android/src/main/AndroidManifest.xml new file mode 100644 index 000000000..3d69995fd --- /dev/null +++ b/amap_flutter/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/amap_flutter/android/src/main/java/com/example/amap_flutter/AmapFlutterPlugin.java b/amap_flutter/android/src/main/java/com/example/amap_flutter/AmapFlutterPlugin.java new file mode 100644 index 000000000..ba72d7ac6 --- /dev/null +++ b/amap_flutter/android/src/main/java/com/example/amap_flutter/AmapFlutterPlugin.java @@ -0,0 +1,168 @@ +package com.example.amap_flutter; + +import android.content.Context; +import androidx.annotation.NonNull; +import android.util.Log; + +import com.amap.api.location.AMapLocation; +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.location.AMapLocationListener; + +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.plugin.common.EventChannel; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; + +import java.util.HashMap; +import java.util.Map; + +/** AmapFlutterPlugin */ +public class AmapFlutterPlugin implements FlutterPlugin, MethodCallHandler { + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private MethodChannel methodChannel; + private EventChannel eventChannel; + private Context applicationContext; + private AMapLocationClient mLocationClient; + private EventChannel.EventSink eventSink; + + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + applicationContext = flutterPluginBinding.getApplicationContext(); + methodChannel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "amap_flutter"); + methodChannel.setMethodCallHandler(this); + + // 初始化EventChannel + eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), "amap_flutter/events"); + eventChannel.setStreamHandler(new EventChannel.StreamHandler() { + @Override + public void onListen(Object arguments, EventChannel.EventSink events) { + eventSink = events; + } + + @Override + public void onCancel(Object arguments) { + eventSink = null; + } + }); + } + + @Override + public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { + switch (call.method) { + case "setApiKey": + setApiKey(call, result); + break; + case "initLocation": + initLocation(result); + break; + case "startLocation": + startLocation(result); + break; + case "stopLocation": + stopLocation(result); + break; + case "dispose": + dispose(result); + break; + default: + result.notImplemented(); + } + } + + private void setApiKey(MethodCall call, Result result) { + try { + String apiKey = call.argument("androidKey"); + AMapLocationClient.updatePrivacyShow(applicationContext, true, true); + AMapLocationClient.updatePrivacyAgree(applicationContext, true); + result.success(null); + } catch (Exception e) { + result.error("INIT_ERROR", "初始化失败", e.getMessage()); + } + } + + private void initLocation(Result result) { + try { + mLocationClient = new AMapLocationClient(applicationContext); + + // 配置定位参数 + AMapLocationClientOption option = new AMapLocationClientOption(); + option.setOnceLocation(true); + option.setNeedAddress(true); + mLocationClient.setLocationOption(option); + + mLocationClient.setLocationListener(mLocationListener); + result.success(null); + } catch (Exception e) { + result.error("INIT_ERROR", "初始化失败", e.getMessage()); + } + } + + private void startLocation(Result result) { + mLocationClient.startLocation(); + result.success(null); + } + + private void stopLocation(Result result) { + destroyLocationClient(); + result.success(null); + } + + private void dispose(Result result) { + try { + destroyLocationClient(); + result.success(null); + } catch (Exception e) { + result.error("DISPOSE_ERROR", "资源释放失败", e.getMessage()); + } + } + + private void destroyLocationClient() { + if (mLocationClient != null) { + try { + // 停止定位 + mLocationClient.stopLocation(); + // 销毁定位客户端 + mLocationClient.onDestroy(); + mLocationClient = null; + + // 关闭事件通道 + if (eventSink != null) { + eventSink.endOfStream(); + eventSink = null; + } + } catch (Exception e) { + Log.e("AmapFlutter", "销毁定位客户端失败", e); + } + } + } + + AMapLocationListener mLocationListener = new AMapLocationListener() { + @Override + public void onLocationChanged(AMapLocation amapLocation) { + if (eventSink == null) return; + + if (amapLocation != null) { + if (amapLocation.getErrorCode() == 0) { + Map locationData = new HashMap<>(); + locationData.put("latitude", amapLocation.getLatitude()); + locationData.put("longitude", amapLocation.getLongitude()); + locationData.put("address", amapLocation.getAddress()); + eventSink.success(locationData); + } + } + } + }; + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + methodChannel.setMethodCallHandler(null); + eventChannel.setStreamHandler(null); + destroyLocationClient(); + } +} diff --git a/amap_flutter/ios/.gitignore b/amap_flutter/ios/.gitignore new file mode 100644 index 000000000..034771fc9 --- /dev/null +++ b/amap_flutter/ios/.gitignore @@ -0,0 +1,38 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/Generated.xcconfig +/Flutter/ephemeral/ +/Flutter/flutter_export_environment.sh diff --git a/amap_flutter/ios/Assets/.gitkeep b/amap_flutter/ios/Assets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/amap_flutter/ios/Classes/AmapFlutterPlugin.swift b/amap_flutter/ios/Classes/AmapFlutterPlugin.swift new file mode 100644 index 000000000..b88657f78 --- /dev/null +++ b/amap_flutter/ios/Classes/AmapFlutterPlugin.swift @@ -0,0 +1,19 @@ +import Flutter +import UIKit + +public class AmapFlutterPlugin: NSObject, FlutterPlugin { + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel(name: "amap_flutter", binaryMessenger: registrar.messenger()) + let instance = AmapFlutterPlugin() + registrar.addMethodCallDelegate(instance, channel: channel) + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "getPlatformVersion": + result("iOS " + UIDevice.current.systemVersion) + default: + result(FlutterMethodNotImplemented) + } + } +} diff --git a/amap_flutter/ios/Resources/PrivacyInfo.xcprivacy b/amap_flutter/ios/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..a34b7e2e6 --- /dev/null +++ b/amap_flutter/ios/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/amap_flutter/ios/amap_flutter.podspec b/amap_flutter/ios/amap_flutter.podspec new file mode 100644 index 000000000..f9ef9f715 --- /dev/null +++ b/amap_flutter/ios/amap_flutter.podspec @@ -0,0 +1,29 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint amap_flutter.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'amap_flutter' + s.version = '0.0.1' + s.summary = 'A new Flutter project.' + s.description = <<-DESC +A new Flutter project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.dependency 'Flutter' + s.platform = :ios, '12.0' + + # Flutter.framework does not contain a i386 slice. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + s.swift_version = '5.0' + + # If your plugin requires a privacy manifest, for example if it uses any + # required reason APIs, update the PrivacyInfo.xcprivacy file to describe your + # plugin's privacy impact, and then uncomment this line. For more information, + # see https://developer.apple.com/documentation/bundleresources/privacy_manifest_files + # s.resource_bundles = {'amap_flutter_privacy' => ['Resources/PrivacyInfo.xcprivacy']} +end diff --git a/amap_flutter/lib/amap_flutter.dart b/amap_flutter/lib/amap_flutter.dart new file mode 100644 index 000000000..6e4c0645c --- /dev/null +++ b/amap_flutter/lib/amap_flutter.dart @@ -0,0 +1,36 @@ +import 'amap_flutter_platform_interface.dart'; + +class AmapFlutter { + // 初始化SDK + Future initSdk({String? iosKey, String? androidKey}) async { + await AmapFlutterPlatform.instance.setApiKey( + iosKey: iosKey, + androidKey: androidKey, + ); + } + + // 定位初始化 + Future initLocation() async { + return AmapFlutterPlatform.instance.initLocation(); + } + + // 开始定位 + Future startLocation() async { + return AmapFlutterPlatform.instance.startLocation(); + } + + // 监听定位返回位置 + Stream locationStream() { + return AmapFlutterPlatform.instance.locationStream(); + } + + // 停止定位 + Future stopLocation() async { + await AmapFlutterPlatform.instance.stopLocation(); + } + + // 销毁 + Future dispose() async { + await AmapFlutterPlatform.instance.dispose(); + } +} diff --git a/amap_flutter/lib/amap_flutter_method_channel.dart b/amap_flutter/lib/amap_flutter_method_channel.dart new file mode 100644 index 000000000..470a9a322 --- /dev/null +++ b/amap_flutter/lib/amap_flutter_method_channel.dart @@ -0,0 +1,45 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +import 'amap_flutter_platform_interface.dart'; + +/// An implementation of [AmapFlutterPlatform] that uses method channels. +class MethodChannelAmapFlutter extends AmapFlutterPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + final methodChannel = const MethodChannel('amap_flutter'); + final eventChannel = const EventChannel('amap_flutter/events'); + + @override + Future setApiKey({String? iosKey, String? androidKey}) async { + await methodChannel.invokeMethod('setApiKey', { + "iosKey": iosKey, + "androidKey": androidKey, + }); + } + + @override + Future initLocation() async { + return await methodChannel.invokeMethod('initLocation'); + } + + @override + Future startLocation() async { + return await methodChannel.invokeMethod('startLocation'); + } + + @override + Stream locationStream() { + return eventChannel.receiveBroadcastStream(); + } + + @override + Future stopLocation() async { + await methodChannel.invokeMethod('stopLocation'); + } + + @override + Future dispose() async { + await methodChannel.invokeMethod('dispose'); + } +} diff --git a/amap_flutter/lib/amap_flutter_platform_interface.dart b/amap_flutter/lib/amap_flutter_platform_interface.dart new file mode 100644 index 000000000..dd1c168c1 --- /dev/null +++ b/amap_flutter/lib/amap_flutter_platform_interface.dart @@ -0,0 +1,49 @@ +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'amap_flutter_method_channel.dart'; + +abstract class AmapFlutterPlatform extends PlatformInterface { + /// Constructs a AmapFlutterPlatform. + AmapFlutterPlatform() : super(token: _token); + + static final Object _token = Object(); + + static AmapFlutterPlatform _instance = MethodChannelAmapFlutter(); + + /// The default instance of [AmapFlutterPlatform] to use. + /// + /// Defaults to [MethodChannelAmapFlutter]. + static AmapFlutterPlatform get instance => _instance; + + /// Platform-specific implementations should set this with their own + /// platform-specific class that extends [AmapFlutterPlatform] when + /// they register themselves. + static set instance(AmapFlutterPlatform instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + Future setApiKey({String? iosKey, String? androidKey}) { + throw UnimplementedError('init() has not been implemented.'); + } + + Future initLocation() { + throw UnimplementedError('initLocation() has not been implemented.'); + } + + Future startLocation() { + throw UnimplementedError('startLocation() has not been implemented.'); + } + + Stream locationStream() { + throw UnimplementedError('locationStream() has not been implemented.'); + } + + Future stopLocation() { + throw UnimplementedError('stopLocation() has not been implemented.'); + } + + Future dispose() { + throw UnimplementedError('dispose() has not been implemented.'); + } +} diff --git a/amap_flutter/pubspec.yaml b/amap_flutter/pubspec.yaml new file mode 100644 index 000000000..b67a2bea6 --- /dev/null +++ b/amap_flutter/pubspec.yaml @@ -0,0 +1,72 @@ +name: amap_flutter +description: "A new Flutter project." +version: 0.0.1 +homepage: + +environment: + sdk: ^3.7.0 + flutter: '>=3.3.0' + +dependencies: + flutter: + sdk: flutter + plugin_platform_interface: ^2.0.2 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + # This section identifies this Flutter project as a plugin project. + # The 'pluginClass' specifies the class (in Java, Kotlin, Swift, Objective-C, etc.) + # which should be registered in the plugin registry. This is required for + # using method channels. + # The Android 'package' specifies package in which the registered class is. + # This is required for using method channels on Android. + # The 'ffiPlugin' specifies that native code should be built and bundled. + # This is required for using `dart:ffi`. + # All these are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + platforms: + android: + package: com.example.amap_flutter + pluginClass: AmapFlutterPlugin + ios: + pluginClass: AmapFlutterPlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f120cc1f7..bfcb323d3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -38,7 +38,7 @@ android:enableOnBackInvokedCallback="true" tools:replace="android:label"> - + @@ -90,6 +90,12 @@ + + + + + + + + + + + + + + + + Date: Sat, 12 Apr 2025 18:41:43 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/src/main/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d2e406498..5def770c9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -41,7 +41,7 @@