Commit 95159111 authored by 汪林玲's avatar 汪林玲

增加空安全

parents
.DS_Store
.dart_tool/
.packages
.pub/
build/
# splash_screen_plugin
启动页广告
## 集成流程
```
/// dart
import 'package:splash_screen_plugin/splash_screen_plugin.dart';
/// 移除启动页-有广告时不做任何操作
SplashScreenPlugin.remove();
/// 监听广告点击
/// [name] 操作类型 click
/// [metedata] 广告原数据
SplashScreenPlugin.setListener((String name, Map<dynamic, dynamic> metedata) {
});
/// 设置广告时间
SplashScreenPlugin.setSeconds(3);
/// 设置广告原数据
SplashScreenPlugin.setMetadata("{}");
/// 设置广告图片,不展示广告设置为null
SplashScreenPlugin.setImage("");
```
```
/// android
/// 在入口activity onCreate 中调用
FlutterJpushVipPlugin.onNewIntent(getIntent());
View view = Hanlder.getInstance().init(getApplicationContext()).createSplashScreen();
addContentView(view, new RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT, RadioGroup.LayoutParams.MATCH_PARENT));
```
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>splash_screen_plugin</name>
<comment>Project android created by Buildship.</comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
</natures>
<filteredResources>
<filter>
<id>0</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
arguments=
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(7.0-rc-1))
connection.project.dir=
eclipse.preferences.version=1
gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home
jvm.arguments=
offline.mode=false
override.workspace.settings=true
show.console.view=true
show.executions.view=true
group 'com.qiaomeng.flutter.splash_screen_plugin'
version '1.0'
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
}
}
rootProject.allprojects {
repositories {
google()
jcenter()
}
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 16
consumerProguardFiles 'proguard-rules.pro'
}
lintOptions {
disable 'InvalidPackage'
}
}
dependencies {
api 'com.github.bumptech.glide:glide:4.9.0'
}
org.gradle.jvmargs=-Xmx1536M
android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
-dontwarn com.bumptech.glide.**
-keep class com.bumptech.glide.**{*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
\ No newline at end of file
rootProject.name = 'splash_screen_plugin'
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.qiaomeng.plugin.splash">
</manifest>
package com.qiaomeng.plugin.splash;
import android.content.Context;
import android.content.SharedPreferences;
public class DBUtils {
private static String METADATA_KEY = "__metadata__";
private static String SECONDS_KEY = "__seconds__";
private static String IMAGE_KEY = "__image__";
private Context context;
public DBUtils(Context context) {
this.context = context;
}
public SharedPreferences getSharedPreferences() {
SharedPreferences sharedPreferences = context.getSharedPreferences("splash_screen", Context.MODE_PRIVATE);
return sharedPreferences;
}
public String getMetadata() {
SharedPreferences sharedPreferences = getSharedPreferences();
String data = sharedPreferences.getString(METADATA_KEY, null);
return data;
}
public void setMetadata(String metadata) {
SharedPreferences sharedPreferences = getSharedPreferences();
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(METADATA_KEY, metadata);
editor.commit();
}
public void setImage(String imageUrl) {
SharedPreferences sharedPreferences = getSharedPreferences();
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(IMAGE_KEY, imageUrl);
editor.commit();
}
public String getImage() {
SharedPreferences sharedPreferences = getSharedPreferences();
String url = sharedPreferences.getString(IMAGE_KEY, null);
return url;
}
public void setSeconds(int seconds) {
SharedPreferences sharedPreferences = getSharedPreferences();
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putInt(SECONDS_KEY, seconds);
editor.commit();
}
public int getSeconds() {
SharedPreferences sharedPreferences = getSharedPreferences();
int seconds = sharedPreferences.getInt(SECONDS_KEY, 3);
return seconds;
}
}
package com.qiaomeng.plugin.splash;
import com.bumptech.glide.load.Key;
import java.security.MessageDigest;
public class DataCacheKey implements Key {
private final Key sourceKey;
private final Key signature;
public DataCacheKey(Key sourceKey, Key signature) {
this.sourceKey = sourceKey;
this.signature = signature;
}
public Key getSourceKey() {
return sourceKey;
}
@Override
public boolean equals(Object o) {
if (o instanceof DataCacheKey) {
DataCacheKey other = (DataCacheKey) o;
return sourceKey.equals(other.sourceKey) && signature.equals(other.signature);
}
return false;
}
@Override
public int hashCode() {
int result = sourceKey.hashCode();
result = 31 * result + signature.hashCode();
return result;
}
@Override
public String toString() {
return "DataCacheKey{" + "sourceKey=" + sourceKey + ", signature=" + signature + '}';
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
sourceKey.updateDiskCacheKey(messageDigest);
signature.updateDiskCacheKey(messageDigest);
}
}
\ No newline at end of file
package com.qiaomeng.plugin.splash;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.disklrucache.DiskLruCache;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.cache.DiskCache;
import com.bumptech.glide.load.engine.cache.SafeKeyGenerator;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.signature.EmptySignature;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Timer;
import java.util.TimerTask;
public class Hanlder {
private static Hanlder instance = new Hanlder();
private Context context;
private View layout;
private DBUtils DB;
private int seconds;
private String imageUrl;
private File imageFile;
private Timer timer = new Timer();
private OnClickListener onClickListener;
private OnExposureListener onExposureListener;
private OnCloseListener onCloseListener;
public static Hanlder getInstance() {
return instance;
}
public Hanlder init(Context context) {
this.context = context;
DB = new DBUtils(context);
seconds = DB.getSeconds();
Glide.init(context, new GlideBuilder());
imageUrl = DB.getImage();
if (imageUrl != null) {
imageFile = getCacheFile(imageUrl);
}
return this;
}
private Hanlder() {
}
public void setMetadata(String metadata) {
DB.setMetadata(metadata);
}
public void setImage(String url) {
Glide.with(context).load(url).apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.DATA)).preload();
DB.setImage(url);
}
public void setSeconds(int seconds) {
DB.setSeconds(seconds);
}
public void remove() {
if (imageUrl == null || imageFile == null) {
removeSplashScreen();
}
}
public View createSplashScreen() {
layout = LayoutInflater.from(context).inflate(R.layout.splash_screen_layout, null, false);
final View logo = layout.findViewById(R.id.xx_logo);
layout.post(new Runnable() {
@Override
public void run() {
int screenHeight = getScreenHeight(context);
int viewHeight = layout.getMeasuredHeight();
int dis = screenHeight - viewHeight;
if (dis > 0) {
logo.setTranslationY(dis);
}
}
});
if (imageUrl != null && imageFile != null) {
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = context.getResources().getDimensionPixelSize(resourceId);
TextView closeBtn = layout.findViewById(R.id.xx_splash_close_btn);
ImageView splashScreenImage = layout.findViewById(R.id.xx_splash_screen_image);
closeBtn.setTranslationY(statusBarHeight);
closeBtn.setVisibility(View.VISIBLE);
splashScreenImage.setVisibility(View.VISIBLE);
Glide.with(context).load(imageFile).apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.DATA))
.into(splashScreenImage);
downTime(closeBtn);
closeBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
removeSplashScreen();
if (onCloseListener != null) {
onCloseListener.onClose(DB.getMetadata());
}
}
});
splashScreenImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListener != null) {
onClickListener.onClick(DB.getMetadata());
onClickListener = null;
removeSplashScreen();
if (onCloseListener != null) {
onCloseListener.onClose(DB.getMetadata());
}
}
}
});
if (onExposureListener != null) {
onExposureListener.onExposure(DB.getMetadata());
}
}
return layout;
}
public void setOnClickListener(OnClickListener listener) {
onClickListener = listener;
}
public void setOnExposureListener(OnExposureListener onExposureListener) {
this.onExposureListener = onExposureListener;
}
public void setOnCloseListener(OnCloseListener onCloseListener) {
this.onCloseListener = onCloseListener;
}
/**
* 获取图片缓存地址
*
* @param url
* @return
*/
private File getCacheFile(String url) {
DataCacheKey dataCacheKey = new DataCacheKey(new GlideUrl(url), EmptySignature.obtain());
SafeKeyGenerator safeKeyGenerator = new SafeKeyGenerator();
String safeKey = safeKeyGenerator.getSafeKey(dataCacheKey);
try {
int cacheSize = 100 * 1000 * 1000;
DiskLruCache diskLruCache = DiskLruCache
.open(new File(context.getCacheDir(), DiskCache.Factory.DEFAULT_DISK_CACHE_DIR), 1, 1, cacheSize);
DiskLruCache.Value value = diskLruCache.get(safeKey);
if (value != null) {
return value.getFile(0);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void downTime(final TextView closeBtn) {
setSecondsText(closeBtn);
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
closeBtn.post(new Runnable() {
@Override
public void run() {
seconds--;
setSecondsText(closeBtn);
if (seconds > 0) {
downTime(closeBtn);
} else {
removeSplashScreen();
if (onCloseListener != null) {
onCloseListener.onClose(DB.getMetadata());
}
}
}
});
}
};
timer.schedule(timerTask, 1000);
}
/**
* 设置关闭按钮秒数
*
* @param closeBtn
*/
private void setSecondsText(TextView closeBtn) {
String text = "跳过 ";
if (seconds > 0) {
text += seconds;
}
closeBtn.setText(text);
}
/**
* 移除启动页
*/
private void removeSplashScreen() {
this.timer.cancel();
if (layout != null) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
@Override
public void run() {
if (layout.getParent() != null) {
ViewGroup parent = (ViewGroup) layout.getParent();
parent.removeView(layout);
}
}
});
}
};
Timer timer = new Timer();
timer.schedule(timerTask, 500);
}
}
// 屏幕的全高
private int getScreenHeight(Context context) {
int dpi = 0;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, displayMetrics);
dpi = displayMetrics.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
public interface OnClickListener {
void onClick(String metedata);
}
public interface OnExposureListener {
void onExposure(String metedata);
}
public interface OnCloseListener {
void onClose(String metedata);
}
}
package com.qiaomeng.plugin.splash;
import android.view.View;
import android.widget.RadioGroup;
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.embedding.engine.plugins.activity.ActivityAware;
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
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;
/**
* SplashScreenPlugin
*/
public class SplashScreenPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
private MethodChannel channel;
private FlutterActivity flutterActivity;
@Override
public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "splash_screen_plugin");
channel.setMethodCallHandler(this);
Hanlder.getInstance().init(flutterPluginBinding.getApplicationContext());
Hanlder.getInstance().setOnClickListener(new Hanlder.OnClickListener() {
@Override
public void onClick(String metedata) {
channel.invokeMethod("click", metedata);
}
});
Hanlder.getInstance().setOnExposureListener(new Hanlder.OnExposureListener() {
@Override
public void onExposure(String metedata) {
channel.invokeMethod("exposure", metedata);
}
});
Hanlder.getInstance().setOnCloseListener(new Hanlder.OnCloseListener() {
@Override
public void onClose(String metedata) {
channel.invokeMethod("close", metedata);
}
});
}
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
if (call.method.equals("setImage")) {
String url = call.argument("imageUrl");
Hanlder.getInstance().setImage(url);
} else if (call.method.equals("setSeconds")) {
if (call.hasArgument("seconds")) {
int seconds = call.argument("seconds");
Hanlder.getInstance().setSeconds(seconds);
}
} else if (call.method.equals("remove")) {
Hanlder.getInstance().remove();
} else if (call.method.equals("setMetadata")) {
String metadata = call.argument("metadata");
Hanlder.getInstance().setMetadata(metadata);
} else if (call.method.equals("splash")) {
if (flutterActivity != null) {
View view = Hanlder.getInstance().init(flutterActivity).createSplashScreen();
flutterActivity.addContentView(view, new RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT,
RadioGroup.LayoutParams.MATCH_PARENT));
}
} else {
result.notImplemented();
}
}
@Override
public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
channel.setMethodCallHandler(null);
}
@Override
public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
flutterActivity = (FlutterActivity) binding.getActivity();
}
@Override
public void onDetachedFromActivityForConfigChanges() {
}
@Override
public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
}
@Override
public void onDetachedFromActivity() {
}
}
<?xml version="1.0" encoding="utf-8"?><!-- android:duration="@android:integer/config_mediumAnimTime" -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<scale
android:duration="1"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:interpolator="@android:anim/decelerate_interpolator"
android:pivotX="1"
android:pivotY="1"
android:repeatCount="0"
android:startOffset="1"
android:toXScale="1.0"
android:toYScale="1.0"/>
</set>
\ No newline at end of file
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.5" android:toAlpha="1.0"
android:duration="@android:integer/config_shortAnimTime"/>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0" android:toAlpha="0.5"
android:duration="@android:integer/config_shortAnimTime"/>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FF302600" />
<corners android:radius="32dp" />
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?><!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- You can insert your own image assets here -->
<item android:drawable="@android:color/white" />
<item android:bottom="20dp">
<bitmap
android:gravity="center_horizontal|bottom"
android:src="@drawable/uz_splash_bg"
android:tileMode="disabled" />
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<View
android:id="@+id/xx_logo"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/splash_screen_background"/>
<ImageView
android:visibility="gone"
android:id="@+id/xx_splash_screen_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="150dp"
android:scaleType="centerCrop"/>
<TextView
android:visibility="gone"
android:id="@+id/xx_splash_close_btn"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/splash_close_btn_drawable"
android:paddingHorizontal="20dp"
android:paddingVertical="6dp"
android:layout_marginRight="13dp"
android:textColor="@android:color/white"
android:layout_marginTop="21dp"/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--Activity进场。出场动画-->
<style name="AnimationActivity" parent="@android:style/Animation.Activity">
<item name="android:windowNoTitle">true</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowIsTranslucent">true</item>
<!--用于设置打开新的Activity并进入新的Activity展示的动画-->
<item name="android:activityOpenEnterAnimation">@anim/anim_in1</item>
<!--用于设置打开新的Activity并销毁之前的Activity展示的动画-->
<item name="android:activityOpenExitAnimation">@anim/anim_in1</item>
<!--用于设置关闭当前Activity进入上一个Activity展示的动画-->
<item name="android:activityCloseEnterAnimation">@anim/anim_in1</item>
<!--用于设置关闭当前Activity时展示的动画-->
<item name="android:activityCloseExitAnimation">@anim/anim_in1</item>
</style>
</resources>
.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/flutter_export_environment.sh
\ No newline at end of file
#import <Flutter/Flutter.h>
@interface SplashScreenPlugin : NSObject<FlutterPlugin>
@end
#import "SplashScreenPlugin.h"
#if __has_include(<splash_screen_plugin/splash_screen_plugin-Swift.h>)
#import <splash_screen_plugin/splash_screen_plugin-Swift.h>
#else
// Support project import fallback if the generated compatibility header
// is not copied when this plugin is created as a library.
// https://forums.swift.org/t/swift-static-libraries-dont-copy-generated-objective-c-header/19816
#import "splash_screen_plugin-Swift.h"
#endif
@implementation SplashScreenPlugin
+ (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar>*)registrar {
[SwiftSplashScreenPlugin registerWithRegistrar:registrar];
}
@end
This diff is collapsed.
#
# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
# Run `pod lib lint splash_screen_plugin.podspec' to validate before publishing.
#
Pod::Spec.new do |s|
s.name = 'splash_screen_plugin'
s.version = '1.1.0'
s.summary = 'A new Flutter plugin.'
s.description = <<-DESC
A new Flutter plugin.
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.resources = ['Images/*.png']
s.dependency 'Flutter'
s.platform = :ios, '10.0'
s.static_framework = true
s.dependency 'SnapKit', '~> 5.0.0'
s.dependency 'Kingfisher', '~> 5.15.7'
# Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
s.swift_version = '5.0'
end
import 'package:flutter/services.dart';
import 'dart:convert';
class SplashScreenPlugin {
static const MethodChannel _channel = const MethodChannel('splash_screen_plugin');
static void setImage(String imageUrl) {
_channel.invokeMethod('setImage', {"imageUrl": imageUrl});
}
static void setSeconds(int seconds) {
_channel.invokeMethod('setSeconds', {"seconds": seconds});
}
static void setMetadata(String metadata) {
_channel.invokeMethod('setMetadata', {"metadata": metadata});
}
static void remove() {
_channel.invokeMethod('remove');
}
static void splash(){
_channel.invokeMethod('splash');
}
static void setListener(Function(String name, Map metedata) callback) {
_channel.setMethodCallHandler((MethodCall call) {
callback(call.method, Map<String, dynamic>.from(json.decode(call.arguments)));
return Future.value(true);
});
}
}
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
characters:
dependency: transitive
description:
name: characters
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.1.0"
collection:
dependency: transitive
description:
name: collection
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.15.0"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
meta:
dependency: transitive
description:
name: meta
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.7.0"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
typed_data:
dependency: transitive
description:
name: typed_data
url: "https://pub.flutter-io.cn"
source: hosted
version: "1.3.0"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.flutter-io.cn"
source: hosted
version: "2.1.0"
sdks:
dart: ">=2.12.0 <3.0.0"
flutter: ">=1.10.0"
name: splash_screen_plugin
description: A new Flutter plugin.
version: 1.1.0
homepage:
environment:
sdk: '>=2.12.0 <3.0.0'
flutter: ">=1.10.0"
dependencies:
flutter:
sdk: flutter
flutter:
plugin:
platforms:
android:
package: com.qiaomeng.plugin.splash
pluginClass: SplashScreenPlugin
ios:
pluginClass: SplashScreenPlugin
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment