phiz_2.45.5.1
Sean 2024-08-21 09:26:56 +08:00
parent 556da305a0
commit adb36ce8ba
29 changed files with 384 additions and 125 deletions

View File

@ -82,19 +82,24 @@ class _MyAppState extends State<MyApp> {
// Platform messages are asynchronous, so we initialize in an async method. // Platform messages are asynchronous, so we initialize in an async method.
Future<void> init() async { Future<void> init() async {
if (Platform.isiOS) { //
//com.finogeeks.mopExample FinStoreConfig storeConfigA = FinStoreConfig(
final res = await Mop.instance.initialize( "22LyZEib0gLTQdU3MUauAfJ/xujwNfM6OvvEqQyH4igA",
'22LyZEib0gLTQdU3MUauARlLry7JL/2fRpscC9kpGZQA', '1c11d7252c53e0b6', "703b9026be3d6bc5",
apiServer: 'https://api.finclip.com', apiPrefix: '/api/v1/mop'); "https://api.finclip.com",
print(res); cryptType: "SM",
} else if (Platform.isAndroid) { );
//com.finogeeks.mopexample List<FinStoreConfig> storeConfigs = [storeConfigA];
final res = await Mop.instance.initialize( Config config = Config(storeConfigs);
'22LyZEib0gLTQdU3MUauARjmmp6QmYgjGb3uHueys1oA', '98c49f97a031b555', config.language = LanguageType.English;
apiServer: 'https://api.finclip.com', apiPrefix: '/api/v1/mop'); config.userId = "abc12345";
print(res); config.channel = "finclip";
} config.phone = "12345678901";
config.appletDebugMode = BOOLState.BOOLStateTrue;
UIConfig uiconfig = UIConfig();
uiconfig.isHideBackHome = true;
final res = await Mop.instance.initSDK(config, uiConfig: uiconfig);
if (!mounted) return; if (!mounted) return;
} }
@ -170,24 +175,29 @@ class _MyAppState extends State<MyApp> {
使 SDK API SDK SDK 使 SDK API SDK SDK
``` ```
/// ///
/// initialize mop miniprogram engine. /// initialize FinClip SDK.
/// /// SDK(使)
/// [appkey] is required. it can be getted from api.finclip.com /// [config] is required. sdk
/// [secret] is required. it can be getted from api.finclip.com /// [uiConfig] is optional. UI
/// [apiServer] is optional. the mop server address. default is https://mp.finogeek.com Future<Map> initSDK(Config config, {UIConfig? uiConfig})
/// [apiPrefix] is optional. the mop server prefix. default is /api/v1/mop
///
///
Future<Map> initialize(String appkey, String secret,
{String apiServer, String apiPrefix})
``` ```
使 使
``` ```
final res = await Mop.instance.initialize( // 1.Config
'22LyZEib0gLTQdU3MUauARlLry7JL/2fRpscC9kpGZQA', '1c11d7252c53e0b6', // 1.1 1
apiServer: 'https://api.finclip.com', apiPrefix: '/api/v1/mop'); FinStoreConfig finclip_store = FinStoreConfig('22LyZEib0gLTQdU3MUauATBwgfnTCJjdr7FCnywmAEM=', 'bdfd76cae24d4313', 'https://api.finclip.com');
// 1.2 2
FinStoreConfig test_store = FinStoreConfig('sdkKey2', 'sdkSecret2', '测试服务器');
Config config = Config([finclip_store, test_store]);
config.userId = '您app的用户唯一标识';
// 2.UIConfig
UIConfig uiConfig = UIConfig();
uiConfig.isHideAddToDesktopMenu = true;
uiConfig.isHideFeedbackAndComplaints = true;
final res = await Mop.instance.initSDK(config, uiConfig: uiConfig);
``` ```
### 2. ### 2.

View File

@ -1,11 +1,11 @@
arguments=--init-script /var/folders/tv/dbm7kt650fvdxrtf0k7xgxcm0000gn/T/d146c9752a26f79b52047fb6dc6ed385d064e120494f96f08ca63a317c41f94c.gradle --init-script /var/folders/tv/dbm7kt650fvdxrtf0k7xgxcm0000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle arguments=--init-script /var/folders/tx/98mydjws12b717spn4mx1wd80000gn/T/db3b08fc4a9ef609cb16b96b200fa13e563f396e9bb1ed0905fdab7bc3bc513b.gradle --init-script /var/folders/tx/98mydjws12b717spn4mx1wd80000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle
auto.sync=false auto.sync=false
build.scans.enabled=false build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.4.2)) connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir= connection.project.dir=
eclipse.preferences.version=1 eclipse.preferences.version=1
gradle.user.home= gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home java.home=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home
jvm.arguments= jvm.arguments=
offline.mode=false offline.mode=false
override.workspace.settings=true override.workspace.settings=true

View File

@ -91,6 +91,6 @@ kapt {
} }
dependencies { dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs') implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.finogeeks.lib:finapplet:2.44.5' implementation 'com.finogeeks.lib:finapplet:2.45.5'
implementation 'com.finogeeks.mop:plugins:2.44.5' implementation 'com.finogeeks.mop:plugins:2.45.5'
} }

View File

@ -158,7 +158,7 @@ public class AppletHandlerModule extends BaseApi {
}.getType())); }.getType()));
if (bitmap != null) { if (bitmap != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] data = baos.toByteArray(); byte[] data = baos.toByteArray();
params.put("bitmap", data); params.put("bitmap", data);
} }

View File

@ -95,7 +95,7 @@ public class AppletManageModule extends BaseApi {
callback.onFail(null); callback.onFail(null);
} }
} else if (event.equals("clearApplets")) { } else if (event.equals("clearApplets")) {
FinAppClient.INSTANCE.getAppletApiManager().clearApplets(); FinAppClient.INSTANCE.getAppletApiManager().finishAllRunningApplets();
callback.onSuccess(null); callback.onSuccess(null);
} else if (event.equals("removeUsedApplet")) { } else if (event.equals("removeUsedApplet")) {
Log.d("MopPlugin", "removeUsedApplet:params:" + param); Log.d("MopPlugin", "removeUsedApplet:params:" + param);

View File

@ -4,6 +4,7 @@ import android.content.Context;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull;
import com.finogeeks.lib.applet.client.FinAppClient; import com.finogeeks.lib.applet.client.FinAppClient;
import com.finogeeks.lib.applet.client.FinAppInfo; import com.finogeeks.lib.applet.client.FinAppInfo;
import com.finogeeks.lib.applet.interfaces.FinCallback; import com.finogeeks.lib.applet.interfaces.FinCallback;
@ -176,7 +177,7 @@ public class AppletModule extends BaseApi {
} else { } else {
taskMode = IFinAppletRequest.TaskMode.MULTI; taskMode = IFinAppletRequest.TaskMode.MULTI;
} }
IFinAppletRequest.ReLaunchMode mode = getReLaunchMode(param);
Log.d("MopPlugin", "startApplet (appId=" + appId + ", sequence=" + sequence + ", apiServer=" + apiServer + ", isSingleProcess:" + isSingleProcess); Log.d("MopPlugin", "startApplet (appId=" + appId + ", sequence=" + sequence + ", apiServer=" + apiServer + ", isSingleProcess:" + isSingleProcess);
// mContextFlutterActivity // mContextFlutterActivity
// Android 6.07.0contextmContext // Android 6.07.0contextmContext
@ -192,7 +193,8 @@ public class AppletModule extends BaseApi {
.setStartParams(params) .setStartParams(params)
.setOfflineParams(offlineFrameworkZipPath, offlineMiniprogramZipPath) .setOfflineParams(offlineFrameworkZipPath, offlineMiniprogramZipPath)
.setProcessMode(processMode) .setProcessMode(processMode)
.setTaskMode(taskMode), .setTaskMode(taskMode)
.setReLaunchMode(mode),
null); null);
// request // request
// FinAppClient.INSTANCE.getAppletApiManager().startApplet(context, IFinAppletRequest.Companion.fromAppId("apiServer", "appId") // FinAppClient.INSTANCE.getAppletApiManager().startApplet(context, IFinAppletRequest.Companion.fromAppId("apiServer", "appId")
@ -238,8 +240,9 @@ public class AppletModule extends BaseApi {
} else { } else {
taskMode = IFinAppletRequest.TaskMode.MULTI; taskMode = IFinAppletRequest.TaskMode.MULTI;
} }
IFinAppletRequest.ReLaunchMode mode = getReLaunchMode(param);
FinAppClient.INSTANCE.getAppletApiManager().startApplet(mContext, IFinAppletRequest.Companion.fromQrCode(qrcode) FinAppClient.INSTANCE.getAppletApiManager().startApplet(mContext, IFinAppletRequest.Companion.fromQrCode(qrcode)
.setProcessMode(processMode).setTaskMode(taskMode), new FinCallback<String>() { .setProcessMode(processMode).setTaskMode(taskMode).setReLaunchMode(mode), new FinCallback<String>() {
@Override @Override
public void onSuccess(String s) { public void onSuccess(String s) {
callback.onSuccess(new HashMap()); callback.onSuccess(new HashMap());
@ -277,6 +280,25 @@ public class AppletModule extends BaseApi {
});*/ });*/
} }
@NonNull
private static IFinAppletRequest.ReLaunchMode getReLaunchMode(Map param) {
IFinAppletRequest.ReLaunchMode mode = IFinAppletRequest.ReLaunchMode.PARAMS_EXIST;
Object modeValue = param.get("reLaunchMode");
if (modeValue != null) {
if (modeValue instanceof Integer) {
int reLaunchMode = (Integer) modeValue;
if (reLaunchMode == 1) {
mode = IFinAppletRequest.ReLaunchMode.ONLY_PARAMS_DIFF;
} else if (reLaunchMode == 2) {
mode = IFinAppletRequest.ReLaunchMode.ALWAYS;
} else if (reLaunchMode == 3) {
mode = IFinAppletRequest.ReLaunchMode.NEVER;
}
}
}
return mode;
}
private void changeUserId(Map param, ICallback callback) { private void changeUserId(Map param, ICallback callback) {
String userId = String.valueOf(param.get("userId")); String userId = String.valueOf(param.get("userId"));
if (FinAppClient.INSTANCE.getFinAppConfig() != null) { if (FinAppClient.INSTANCE.getFinAppConfig() != null) {

View File

@ -80,6 +80,15 @@ public class InitSDKModule extends BaseApi {
if (userId != null) { if (userId != null) {
configBuilder.setUserId(userId); configBuilder.setUserId(userId);
} }
String channel = (String) configMap.get("channel");
if (channel != null) {
configBuilder.setChannel(channel);
}
String phone = (String) configMap.get("phone");
if (phone != null) {
configBuilder.setPhone(phone);
}
String productIdentification = (String) configMap.get("productIdentification"); String productIdentification = (String) configMap.get("productIdentification");
if (productIdentification != null) { if (productIdentification != null) {
configBuilder.setProductIdentification(productIdentification); configBuilder.setProductIdentification(productIdentification);

View File

@ -1,11 +1,11 @@
arguments=--init-script /var/folders/tv/dbm7kt650fvdxrtf0k7xgxcm0000gn/T/d146c9752a26f79b52047fb6dc6ed385d064e120494f96f08ca63a317c41f94c.gradle --init-script /var/folders/tv/dbm7kt650fvdxrtf0k7xgxcm0000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle arguments=--init-script /var/folders/tx/98mydjws12b717spn4mx1wd80000gn/T/d146c9752a26f79b52047fb6dc6ed385d064e120494f96f08ca63a317c41f94c.gradle --init-script /var/folders/tx/98mydjws12b717spn4mx1wd80000gn/T/52cde0cfcf3e28b8b7510e992210d9614505e0911af0c190bd590d7158574963.gradle
auto.sync=false auto.sync=false
build.scans.enabled=false build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
connection.project.dir= connection.project.dir=
eclipse.preferences.version=1 eclipse.preferences.version=1
gradle.user.home= gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home java.home=/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home
jvm.arguments= jvm.arguments=
offline.mode=false offline.mode=false
override.workspace.settings=true override.workspace.settings=true

View File

@ -70,7 +70,7 @@ flutter {
} }
dependencies { dependencies {
def sdk_version = "2.41.3" def sdk_version = "2.45.1"
compileOnly "com.finogeeks.lib:finapplet:2.41.4-dev20230721v13" compileOnly "com.finogeeks.lib:finapplet:${sdk_version}"
implementation "com.finogeeks.mop:plugins:${sdk_version}" implementation "com.finogeeks.mop:plugins:${sdk_version}"
} }

View File

@ -1,11 +1,11 @@
PODS: PODS:
- FinApplet (2.40.12-dev20230615v03) - FinApplet (2.45.1)
- FinAppletExt (2.40.12-dev20230615v03): - FinAppletExt (2.45.1):
- FinApplet (= 2.40.12-dev20230615v03) - FinApplet (= 2.45.1)
- Flutter (1.0.0) - Flutter (1.0.0)
- mop (0.1.1): - mop (0.1.1):
- FinApplet (= 2.40.12-dev20230615v03) - FinApplet (= 2.45.1)
- FinAppletExt (= 2.40.12-dev20230615v03) - FinAppletExt (= 2.45.1)
- Flutter - Flutter
DEPENDENCIES: DEPENDENCIES:
@ -13,7 +13,7 @@ DEPENDENCIES:
- mop (from `.symlinks/plugins/mop/ios`) - mop (from `.symlinks/plugins/mop/ios`)
SPEC REPOS: SPEC REPOS:
ssh://gitlab.finogeeks.club/finclip-ios/DevPods: ssh://gitlab.finogeeks.club/finclip-ios/FinPods:
- FinApplet - FinApplet
- FinAppletExt - FinAppletExt
@ -24,11 +24,11 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/mop/ios" :path: ".symlinks/plugins/mop/ios"
SPEC CHECKSUMS: SPEC CHECKSUMS:
FinApplet: 8c14ee57dcefca25074fc4ae5ff047d0636d9116 FinApplet: eea27894485c871a94b2ded79a8fe1e84d7ffcc9
FinAppletExt: b6356d98e0897017611a402aaf97f24686652d93 FinAppletExt: 231dde4c4ed3862b70179c3dfac7406090ace955
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
mop: 2610a14e951144088f87aea5881db9c5d58a5995 mop: afa40651ec188a85a27c068d5afa2a97c6a53a01
PODFILE CHECKSUM: 2da0220ee5ba22a2dfcec42dfe5b17d05f3c3da9 PODFILE CHECKSUM: 2da0220ee5ba22a2dfcec42dfe5b17d05f3c3da9
COCOAPODS: 1.11.3 COCOAPODS: 1.15.2

View File

@ -3,7 +3,7 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 51; objectVersion = 54;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
@ -367,6 +367,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9QCKYFU5M4;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = finclip_example; INFOPLIST_KEY_CFBundleDisplayName = finclip_example;
@ -377,6 +378,7 @@
MARKETING_VERSION = 1.0.0; MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finogeeks.finosprite; PRODUCT_BUNDLE_IDENTIFIER = com.finogeeks.finosprite;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = wild_all;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
@ -495,8 +497,10 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Manual;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 9QCKYFU5M4; DEVELOPMENT_TEAM = "";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9QCKYFU5M4;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = finclip_example; INFOPLIST_KEY_CFBundleDisplayName = finclip_example;
@ -507,6 +511,8 @@
MARKETING_VERSION = 1.0.0; MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finogeeks.finosprite; PRODUCT_BUNDLE_IDENTIFIER = com.finogeeks.finosprite;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = wild_all;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -520,8 +526,10 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 9QCKYFU5M4; DEVELOPMENT_TEAM = 9QCKYFU5M4;
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 9QCKYFU5M4;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = finclip_example; INFOPLIST_KEY_CFBundleDisplayName = finclip_example;
@ -532,6 +540,7 @@
MARKETING_VERSION = 1.0.0; MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = com.finogeeks.finosprite; PRODUCT_BUNDLE_IDENTIFIER = com.finogeeks.finosprite;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
"PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = wild_all;
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>

View File

@ -1,13 +1,11 @@
// ignore_for_file: prefer_const_constructors // ignore_for_file: prefer_const_constructors
import 'dart:ffi';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:mop/api.dart'; import 'package:mop/api.dart';
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:mop/mop.dart'; import 'package:mop/mop.dart';
import 'package:mop_example/test_page.dart';
void main() => runApp(MyApp()); void main() => runApp(MyApp());
@ -22,7 +20,10 @@ class _MyAppState extends State<MyApp> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
Future.delayed(const Duration(seconds: 3), () {
init(); init();
});
} }
// Platform messages are asynchronous, so we initialize in an async method. // Platform messages are asynchronous, so we initialize in an async method.
@ -45,6 +46,9 @@ class _MyAppState extends State<MyApp> {
Config config = Config(storeConfigs); Config config = Config(storeConfigs);
config.language = LanguageType.English; config.language = LanguageType.English;
config.baseLoadingViewClass = "LoadingView"; config.baseLoadingViewClass = "LoadingView";
config.userId = "18607180143";
config.channel = "finclip";
config.phone = "1234567890";
config.appletDebugMode = BOOLState.BOOLStateTrue; config.appletDebugMode = BOOLState.BOOLStateTrue;
UIConfig uiconfig = UIConfig(); UIConfig uiconfig = UIConfig();
@ -143,7 +147,7 @@ class _MyAppState extends State<MyApp> {
); );
} }
Widget _buildAppletWidget(String appletId, String appletName) { Widget _buildAppletWidget(String appletId, String appletName, int index, Map<String, String>? startParams) {
return Container( return Container(
margin: EdgeInsets.only(left: 20, top: 30, right: 20), margin: EdgeInsets.only(left: 20, top: 30, right: 20),
child: Column( child: Column(
@ -159,31 +163,43 @@ class _MyAppState extends State<MyApp> {
Container( Container(
height: 100, height: 100,
child: GridView.count( child: GridView.count(
crossAxisCount: 3, crossAxisCount: 4,
childAspectRatio: 2, childAspectRatio: 2,
crossAxisSpacing: 30, crossAxisSpacing: 10,
// physics: NeverScrollableScrollPhysics(), // physics: NeverScrollableScrollPhysics(),
children: [ children: [
_buildAppletItem(appletId, "打开小程序", () { _buildAppletItem(appletId, "open", () {
TranstionStyle style = TranstionStyle.TranstionStyleUp; TranstionStyle style = TranstionStyle.TranstionStyleUp;
if (appletId == "5f72e3559a6a7900019b5baa") { FCReLaunchMode mode = FCReLaunchMode.PARAMS_EXIST;
if (index == 1) {
mode = FCReLaunchMode.ONLY_PARAMS_DIFF;
style = TranstionStyle.TranstionStylePush; style = TranstionStyle.TranstionStylePush;
} else if (index == 2) {
mode = FCReLaunchMode.ALWAYS;
} else if (index == 3) {
mode = FCReLaunchMode.NEVER;
} }
RemoteAppletRequest request = RemoteAppletRequest(apiServer: 'https://api.finclip.com', appletId: appletId, transitionStyle: style);
RemoteAppletRequest request = RemoteAppletRequest(
apiServer: 'https://api.finclip.com',
appletId: appletId,
transitionStyle: style,
reLaunchMode: mode,
startParams: startParams);
Mop.instance.startApplet(request); Mop.instance.startApplet(request);
// Mop.instance.qrcodeOpenApplet('https://api.finclip.com/api/v1/mop/runtime/applet/-f-MGYzN2Q1YTYzMmI2MWIyZg--'); // Mop.instance.qrcodeOpenApplet('https://api.finclip.com/api/v1/mop/runtime/applet/-f-MGYzN2Q1YTYzMmI2MWIyZg--');
}), }),
_buildAppletItem(appletId, "finishRunningApplet", () { _buildAppletItem(appletId, "finish", () {
Mop.instance.finishRunningApplet(appletId, true); Mop.instance.finishRunningApplet(appletId, true);
}), }),
_buildAppletItem(appletId, "removeUsedApplet", () { _buildAppletItem(appletId, "remove", () {
Mop.instance.removeUsedApplet(appletId); Mop.instance.removeUsedApplet(appletId);
}), }),
// _buildAppletItem(appletId, "removeUsedApplet", () { _buildAppletItem(appletId, "finishAll", () {
// Mop.instance.removeUsedApplet(appletId); Mop.instance.clearApplets();
// }), }),
], ],
), ),
) )
@ -199,13 +215,29 @@ class _MyAppState extends State<MyApp> {
home: Scaffold( home: Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('凡泰极客小程序 Flutter 插件'), title: const Text('凡泰极客小程序 Flutter 插件'),
actions: <Widget>[
Builder(
builder: (context) {
return IconButton(
icon: Icon(Icons.more_horiz),
tooltip: 'More',
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => TestPage()),
);
},
);
},
),
],
), ),
body: Column( body: Column(
children: <Widget>[ children: <Widget>[
_buildAppletWidget("5facb3a52dcbff00017469bd", "画图小程序"), _buildAppletWidget("5facb3a52dcbff00017469bd", "画图小程序", 0, {'query':'ramdom='+context.hashCode.toString()}),
_buildAppletWidget("5f72e3559a6a7900019b5baa", "官方小程序"), _buildAppletWidget("5f72e3559a6a7900019b5baa", "官方小程序", 1, {'query':'key=value'}),
_buildAppletWidget("5f17f457297b540001e06ebb", "api测试小程序"), _buildAppletWidget("5f17f457297b540001e06ebb", "api测试小程序", 2, null),
_buildAppletWidget("61386f6484dd160001d3e1ab", "测试小程序"), _buildAppletWidget("61386f6484dd160001d3e1ab", "测试小程序", 3, {'query':'ramdom='+context.hashCode.toString()}),
], ],
), ),

View File

@ -0,0 +1,136 @@
import 'package:flutter/material.dart';
import 'package:mop/mop.dart';
class TestPage extends StatefulWidget {
@override
_TestPageState createState() => _TestPageState();
}
class _TestPageState extends State<TestPage> {
final TextEditingController _controller1 = TextEditingController(text: '5f72e3559a6a7900019b5baa');
final TextEditingController _controller2 = TextEditingController();
final TextEditingController _controller3 = TextEditingController(text: 'key1=value2&name=zhangsan');
final TextEditingController _controller4 = TextEditingController(text: 'https://api.finclip.com/api/v1/mop/runtime/applet/-f-f1362bb056a265aa--');
int _selectedRadio = 0;
void _handleRadioValueChange(int? value) {
setState(() {
_selectedRadio = value!;
});
}
void _handleButtonPress() {
//
String appId = _controller1.text.trim();
String path = _controller2.text.trim();
String query = _controller3.text.trim();
int index = _selectedRadio;
FCReLaunchMode mode = FCReLaunchMode.PARAMS_EXIST;
if (index == 1) {
mode = FCReLaunchMode.ONLY_PARAMS_DIFF;
} else if (index == 2) {
mode = FCReLaunchMode.ALWAYS;
} else if (index == 3) {
mode = FCReLaunchMode.NEVER;
}
Map<String, String>? startParams = {};
if (path.length > 0) {
startParams["path"] = path;
}
if (query.length > 0) {
startParams["query"] = query;
}
RemoteAppletRequest request = RemoteAppletRequest(
apiServer: 'https://api.finclip.com',
appletId: appId,
reLaunchMode: mode,
startParams: startParams);
Mop.instance.startApplet(request);
}
void _handleqrCodeButtonPress() {
String qrcode = _controller4.text.trim();
int index = _selectedRadio;
FCReLaunchMode mode = FCReLaunchMode.PARAMS_EXIST;
if (index == 1) {
mode = FCReLaunchMode.ONLY_PARAMS_DIFF;
} else if (index == 2) {
mode = FCReLaunchMode.ALWAYS;
} else if (index == 3) {
mode = FCReLaunchMode.NEVER;
}
QRCodeAppletRequest qrcodeRequest = QRCodeAppletRequest(qrcode, reLaunchMode: mode);
Mop.instance.qrcodeStartApplet(qrcodeRequest);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('测试页面'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
children: <Widget>[
_buildTextField(_controller1, '小程序id'),
_buildTextField(_controller2, '输入path'),
_buildTextField(_controller3, '输入query'),
_buildTextField(_controller4, '二维码地址'),
SizedBox(height: 10),
Column(
children: <Widget>[
_buildRadioTile(0, 'ParamExist'),
_buildRadioTile(1, 'OnlyParamDiff'),
_buildRadioTile(2, 'Always'),
_buildRadioTile(3, 'Never'),
],
),
SizedBox(height: 10),
ElevatedButton(
onPressed: _handleButtonPress,
child: Text('打开小程序'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: _handleqrCodeButtonPress,
child: Text('二维码打开小程序'),
),
],
),
),
);
}
Widget _buildTextField(TextEditingController controller, String hintText) {
return TextField(
controller: controller,
decoration: InputDecoration(
hintText: hintText,
border: OutlineInputBorder(),
contentPadding: EdgeInsets.symmetric(vertical: 12.0, horizontal: 16.0),
),
);
}
Widget _buildRadioTile(int value, String title) {
return GestureDetector(
onTap: () => _handleRadioValueChange(value),
child: Row(
children: <Widget>[
Radio(
value: value,
groupValue: _selectedRadio,
onChanged: _handleRadioValueChange,
),
Text(title),
],
),
);
}
}

View File

@ -7,7 +7,7 @@ packages:
name: async name: async
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.9.0" version: "2.8.2"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -21,14 +21,21 @@ packages:
name: characters name: characters
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.1" version: "1.2.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.1" version: "1.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
@ -49,7 +56,7 @@ packages:
name: fake_async name: fake_async
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.3.1" version: "1.3.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -68,7 +75,7 @@ packages:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.0.9" version: "2.0.14"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -87,35 +94,35 @@ packages:
name: matcher name: matcher
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.12.12" version: "0.12.11"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.1.5" version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.0" version: "1.7.0"
mop: mop:
dependency: "direct main" dependency: "direct main"
description: description:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "2.41.1" version: "2.45.1"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.2" version: "1.8.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -127,7 +134,7 @@ packages:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.9.0" version: "1.8.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -148,21 +155,21 @@ packages:
name: string_scanner name: string_scanner
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.1" version: "1.1.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.1" version: "1.2.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.4.12" version: "0.4.9"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
@ -171,5 +178,5 @@ packages:
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
sdks: sdks:
dart: ">=2.17.0-0 <3.0.0" dart: ">=2.17.0 <3.0.0"
flutter: ">=3.0.0" flutter: ">=3.0.0"

View File

@ -13,9 +13,10 @@
- (void)setupApiWithSuccess:(void (^)(NSDictionary<NSString *,id> * _Nonnull))success failure:(void (^)(id _Nullable))failure cancel:(void (^)(void))cancel - (void)setupApiWithSuccess:(void (^)(NSDictionary<NSString *,id> * _Nonnull))success failure:(void (^)(id _Nullable))failure cancel:(void (^)(void))cancel
{ {
NSLog(@"clearApplets"); NSLog(@"clearApplets");
[[FATClient sharedClient]clearMemoryCache]; [[FATClient sharedClient] closeAllAppletsWithCompletion:^{
[[FATClient sharedClient]clearLocalApplets]; [[FATClient sharedClient] clearMemoryCache];
success(@{}); success(@{});
}];
} }
@end @end

View File

@ -13,7 +13,7 @@
- (void)setupApiWithSuccess:(void (^)(NSDictionary<NSString *,id> * _Nonnull))success failure:(void (^)(id _Nullable))failure cancel:(void (^)(void))cancel - (void)setupApiWithSuccess:(void (^)(NSDictionary<NSString *,id> * _Nonnull))success failure:(void (^)(id _Nullable))failure cancel:(void (^)(void))cancel
{ {
NSLog(@"closeAllApplets"); NSLog(@"closeAllApplets");
[[FATClient sharedClient] closeAllApplets]; [[FATClient sharedClient] closeAllAppletsWithCompletion:nil];
success(@{}); success(@{});
} }

View File

@ -47,6 +47,8 @@
} }
config.currentUserId = self.config[@"userId"]; config.currentUserId = self.config[@"userId"];
config.channel = self.config[@"channel"];
config.phone = self.config[@"phone"];
config.productIdentification = self.config[@"productIdentification"]; config.productIdentification = self.config[@"productIdentification"];
config.disableAuthorize = [self.config[@"disableRequestPermissions"] boolValue]; config.disableAuthorize = [self.config[@"disableRequestPermissions"] boolValue];
config.appletAutoAuthorize = [self.config[@"appletAutoAuthorize"] boolValue]; config.appletAutoAuthorize = [self.config[@"appletAutoAuthorize"] boolValue];

View File

@ -12,6 +12,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface MOP_qrcodeOpenApplet : MOPBaseApi @interface MOP_qrcodeOpenApplet : MOPBaseApi
@property (nonatomic,copy) NSString *qrcode; @property (nonatomic,copy) NSString *qrcode;
@property (nonatomic,copy) NSString *reLaunchMode;
@end @end

View File

@ -15,6 +15,7 @@
NSLog(@"MOP_qrcodeOpenApplet:%@", self.qrcode); NSLog(@"MOP_qrcodeOpenApplet:%@", self.qrcode);
FATAppletQrCodeRequest *qrcodeRequest = [[FATAppletQrCodeRequest alloc] init]; FATAppletQrCodeRequest *qrcodeRequest = [[FATAppletQrCodeRequest alloc] init];
qrcodeRequest.qrCode = self.qrcode; qrcodeRequest.qrCode = self.qrcode;
qrcodeRequest.reLaunchMode = [self.reLaunchMode intValue];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIViewController *currentVC = [MOPTools topViewController]; UIViewController *currentVC = [MOPTools topViewController];

View File

@ -30,12 +30,9 @@
} }
// //
BOOL hasError = [[result allKeys] containsObject:@"errMsg"]; BOOL hasError = [[result allKeys] containsObject:@"errMsg"];
if (hasError) { if (hasError) {
NSString *errMsg = result[@"errMsg"]; NSString *errMsg = result[@"errMsg"];
NSString *errPrefix = [NSString stringWithFormat:@"%@:fail", name]; NSString *errPrefix = [NSString stringWithFormat:@"%@:fail", name];
NSLog(@"extensionApi2 [%@] reslut:%@", errPrefix, errMsg);
BOOL isFail = [errMsg hasPrefix:errPrefix]; BOOL isFail = [errMsg hasPrefix:errPrefix];
if (isFail) { if (isFail) {
NSLog(@"extensionApi reslut:fail"); NSLog(@"extensionApi reslut:fail");

View File

@ -17,8 +17,9 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, copy) NSDictionary *startParams; @property (nonatomic, copy) NSDictionary *startParams;
@property (nonatomic, copy) NSString *offlineMiniprogramZipPath; @property (nonatomic, copy) NSString *offlineMiniprogramZipPath;
@property (nonatomic, copy) NSString *offlineFrameworkZipPath; @property (nonatomic, copy) NSString *offlineFrameworkZipPath;
@property (nonatomic, strong) NSString *animated; @property (nonatomic, copy) NSString *animated;
@property (nonatomic, strong) NSString *transitionStyle; @property (nonatomic, copy) NSString *transitionStyle;
@property (nonatomic, copy) NSString *reLaunchMode;
@end @end

View File

@ -26,6 +26,7 @@
request.offlineFrameworkZipPath = self.offlineFrameworkZipPath; request.offlineFrameworkZipPath = self.offlineFrameworkZipPath;
request.animated = [self.animated boolValue]; request.animated = [self.animated boolValue];
request.transitionStyle = [self.transitionStyle intValue]; request.transitionStyle = [self.transitionStyle intValue];
request.reLaunchMode = [self.reLaunchMode intValue];
// //
[[FATClient sharedClient] startAppletWithRequest:request InParentViewController:currentVC completion:^(BOOL result, NSError *error) { [[FATClient sharedClient] startAppletWithRequest:request InParentViewController:currentVC completion:^(BOOL result, NSError *error) {

View File

@ -154,6 +154,7 @@ static MopPlugin *_instance;
request.command = call.method; request.command = call.method;
request.param = (NSDictionary*)call.arguments; request.param = (NSDictionary*)call.arguments;
MOPBaseApi* api = [MOPApiConverter apiWithRequest: request]; MOPBaseApi* api = [MOPApiConverter apiWithRequest: request];
NSLog(@"method:%@, param:%@", request.command, request.param);
if (api) { if (api) {
[api setupApiWithSuccess:^(NSDictionary<NSString *,id> * _Nonnull data) { [api setupApiWithSuccess:^(NSDictionary<NSString *,id> * _Nonnull data) {
result(@{@"retMsg":@"ok",@"success":@(YES),@"data": data ? : @{}}); result(@{@"retMsg":@"ok",@"success":@(YES),@"data": data ? : @{}});

View File

@ -21,8 +21,8 @@ A finclip miniprogram flutter sdk.
s.vendored_libraries = 'Classes/FinAppletExt/Vendor/Lame/libmp3lame.a' s.vendored_libraries = 'Classes/FinAppletExt/Vendor/Lame/libmp3lame.a'
s.static_framework = true s.static_framework = true
s.dependency 'FinApplet' , '2.44.5' s.dependency 'FinApplet' , '2.45.5'
# s.dependency 'FinAppletExt' # s.dependency 'FinAppletExt'
s.dependency 'FinAppletBLE' , '2.44.5' s.dependency 'FinAppletBLE' , '2.45.5'
end end

View File

@ -22,6 +22,7 @@ A finclip miniprogram flutter sdk.
s.static_framework = true s.static_framework = true
s.dependency 'FinApplet' , '__finapplet_version__' s.dependency 'FinApplet' , '__finapplet_version__'
# s.dependency 'FinAppletExt' , '__finapplet_version__'
s.dependency 'FinAppletBLE' s.dependency 'FinAppletBLE'
end end

View File

@ -74,6 +74,11 @@ class Config {
/// userId /// userId
String? userId; String? userId;
// bundleId
String? channel;
// token
String? phone;
/// finclipfinogeeksuserAgentfinogeeks /// finclipfinogeeksuserAgentfinogeeks
String? productIdentification; String? productIdentification;
@ -250,6 +255,8 @@ class Config {
return { return {
"finStoreConfigs": storeConfigs, "finStoreConfigs": storeConfigs,
"userId": userId, "userId": userId,
"channel": channel,
"phone": phone,
"productIdentification": productIdentification, "productIdentification": productIdentification,
"disableRequestPermissions": disableRequestPermissions, "disableRequestPermissions": disableRequestPermissions,
"appletAutoAuthorize": appletAutoAuthorize, "appletAutoAuthorize": appletAutoAuthorize,
@ -849,6 +856,9 @@ class RemoteAppletRequest {
// androidfalse // androidfalse
bool isSingTask; bool isSingTask;
// reLaunch
FCReLaunchMode reLaunchMode;
RemoteAppletRequest({ RemoteAppletRequest({
required this.apiServer, required this.apiServer,
required this.appletId, required this.appletId,
@ -860,6 +870,7 @@ class RemoteAppletRequest {
this.transitionStyle = TranstionStyle.TranstionStyleUp, this.transitionStyle = TranstionStyle.TranstionStyleUp,
this.isSingleProcess = false, this.isSingleProcess = false,
this.isSingTask = false, this.isSingTask = false,
this.reLaunchMode = FCReLaunchMode.PARAMS_EXIST,
}); });
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
@ -870,6 +881,7 @@ class RemoteAppletRequest {
"isSingleProcess": isSingleProcess, "isSingleProcess": isSingleProcess,
"isSingTask": isSingTask, "isSingTask": isSingTask,
"transitionStyle": transitionStyle.index, "transitionStyle": transitionStyle.index,
"reLaunchMode": reLaunchMode.index,
}; };
if (startParams != null) result["startParams"] = startParams; if (startParams != null) result["startParams"] = startParams;
if (offlineMiniprogramZipPath != null) if (offlineMiniprogramZipPath != null)
@ -895,15 +907,19 @@ class QRCodeAppletRequest {
// androidfalse // androidfalse
bool isSingTask; bool isSingTask;
// reLaunch
FCReLaunchMode reLaunchMode;
QRCodeAppletRequest(this.qrCode, QRCodeAppletRequest(this.qrCode,
{this.isSingleProcess = false, this.isSingTask = false}); {this.isSingleProcess = false, this.isSingTask = false, this.reLaunchMode = FCReLaunchMode.PARAMS_EXIST});
Map<String, dynamic> toMap() { Map<String, dynamic> toMap() {
return { return {
"apiServer": qrCode, "qrcode": qrCode,
"animated": animated, "animated": animated,
"isSingleProcess": isSingleProcess, "isSingleProcess": isSingleProcess,
"isSingTask": isSingTask, "isSingTask": isSingTask,
"reLaunchMode": reLaunchMode.index,
}; };
} }
} }
@ -949,6 +965,13 @@ enum LogLevel {
LEVEL_NONE LEVEL_NONE
} }
enum FCReLaunchMode {
PARAMS_EXIST, // pathqueryreLaunch
ONLY_PARAMS_DIFF, // reLaunch
ALWAYS, // reLaunch
NEVER // reLaunch
}
class Mop { class Mop {
static final Mop _instance = new Mop._internal(); static final Mop _instance = new Mop._internal();
late MethodChannel _channel; late MethodChannel _channel;
@ -1142,6 +1165,12 @@ class Mop {
return await _channel.invokeMapMethod("qrcodeOpenApplet", params); return await _channel.invokeMapMethod("qrcodeOpenApplet", params);
} }
Future<Map> qrcodeStartApplet(QRCodeAppletRequest qrcodeRequest) async {
Map<String, dynamic> params = qrcodeRequest.toMap();
final Map ret = await _channel.invokeMethod("qrcodeOpenApplet", params);
return ret;
}
/// -- /// --
Future scanOpenApplet(String info, Future scanOpenApplet(String info,
{bool isSingleProcess = false, bool isSingTask = false}) async { {bool isSingleProcess = false, bool isSingTask = false}) async {
@ -1186,7 +1215,7 @@ class Mop {
} }
/// clear applets cache /// clear applets cache
/// ///
Future clearApplets() async { Future clearApplets() async {
return await _channel.invokeMethod("clearApplets"); return await _channel.invokeMethod("clearApplets");
} }

View File

@ -7,7 +7,7 @@ packages:
name: async name: async
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.9.0" version: "2.8.2"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -21,14 +21,21 @@ packages:
name: characters name: characters
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.1" version: "1.2.0"
charcode:
dependency: transitive
description:
name: charcode
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.1"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.1" version: "1.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
@ -42,7 +49,7 @@ packages:
name: fake_async name: fake_async
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.3.1" version: "1.3.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -61,7 +68,7 @@ packages:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "2.0.6" version: "2.0.14"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -80,28 +87,28 @@ packages:
name: matcher name: matcher
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.12.12" version: "0.12.11"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.1.5" version: "0.1.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.0" version: "1.7.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.8.2" version: "1.8.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -113,7 +120,7 @@ packages:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.9.0" version: "1.8.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -134,21 +141,21 @@ packages:
name: string_scanner name: string_scanner
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.1.1" version: "1.1.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "1.2.1" version: "1.2.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.flutter-io.cn"
source: hosted source: hosted
version: "0.4.12" version: "0.4.9"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
@ -157,5 +164,5 @@ packages:
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
sdks: sdks:
dart: ">=2.17.0-0 <3.0.0" dart: ">=2.17.0 <3.0.0"
flutter: ">=2.2.3" flutter: ">=3.0.0"

View File

@ -1,6 +1,6 @@
name: mop name: mop
description: A Finogeeks MiniProgram Flutter SDK. description: A Finogeeks MiniProgram Flutter SDK.
version: '2.44.5' version: '2.45.5'
homepage: https://github.com/finogeeks/mop-flutter-sdk homepage: https://github.com/finogeeks/mop-flutter-sdk
environment: environment: