From c71b45bc3781aabbff75dbc5e004e550a6bace0f Mon Sep 17 00:00:00 2001 From: jk Date: Sat, 10 Oct 2020 12:40:58 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=94=B9=E5=8A=A8=EF=BC=9A=201.=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=85=E5=88=A0=E9=99=A4Flutter=E4=BE=A7?= =?UTF-8?q?=E7=BC=93=E5=AD=98=EF=BC=88remove=20from=20flutter=20mmkvCache?= =?UTF-8?q?=EF=BC=89=202.=20=E6=89=A7=E8=A1=8Cclear=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=88=A0=E9=99=A4=E5=B8=A6?= =?UTF-8?q?'mmkv.flutter.'=E5=89=8D=E7=BC=80=E7=9A=84key=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E4=BC=9A=E6=B8=85=E7=A9=BAdefaultMMKV=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bigbug/mmkvflutter/MmkvFlutterPlugin.java | 14 +++- example/.flutter-plugins-dependencies | 1 + .../android/app/src/main/AndroidManifest.xml | 17 ++++- .../mmkvflutterexample/MainActivity.java | 17 +++-- example/android/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- example/ios/Flutter/.last_build_id | 1 + example/ios/Flutter/Flutter.podspec | 18 +++++ .../ios/Flutter/flutter_export_environment.sh | 16 ++++ example/ios/Podfile | 69 ++++++----------- example/ios/Runner.xcodeproj/project.pbxproj | 34 ++------- ...gs.xcsettings => IDEWorkspaceChecks.plist} | 4 +- example/lib/main.dart | 1 - ios/Classes/MmkvFlutterPlugin.h | 1 + ios/Classes/MmkvFlutterPlugin.m | 65 ++++++++++------ ios/mmkv_flutter.podspec | 2 +- lib/mmkv_flutter.dart | 74 +++++++++++++------ pubspec.yaml | 4 +- 18 files changed, 206 insertions(+), 138 deletions(-) create mode 100644 example/.flutter-plugins-dependencies create mode 100644 example/ios/Flutter/.last_build_id create mode 100644 example/ios/Flutter/Flutter.podspec create mode 100755 example/ios/Flutter/flutter_export_environment.sh rename example/ios/Runner.xcworkspace/xcshareddata/{WorkspaceSettings.xcsettings => IDEWorkspaceChecks.plist} (77%) diff --git a/android/src/main/java/com/bigbug/mmkvflutter/MmkvFlutterPlugin.java b/android/src/main/java/com/bigbug/mmkvflutter/MmkvFlutterPlugin.java index 6d0a523..30627e2 100644 --- a/android/src/main/java/com/bigbug/mmkvflutter/MmkvFlutterPlugin.java +++ b/android/src/main/java/com/bigbug/mmkvflutter/MmkvFlutterPlugin.java @@ -16,6 +16,7 @@ public class MmkvFlutterPlugin implements MethodCallHandler { public static final String KEY="key"; public static final String VALUE="value"; + public static final String PREFIX="mmkv.flutter."; private final MMKV mmkv; @@ -85,7 +86,18 @@ public void onMethodCall(MethodCall call, Result result) { result.success(true); break; case "clear": - mmkv.clearAll(); + /// 改动:是否只需要删带有'mmkv.flutter.'前缀的key + boolean prefixing = (boolean) call.argument("prefixing"); + if (prefixing) { + String [] allKeys = mmkv.allKeys(); + for(String obj : allKeys) { + if (obj.startsWith(PREFIX)) { + mmkv.removeValueForKey(obj); + } + } + } else { + mmkv.clearAll(); + } result.success(true); break; default: diff --git a/example/.flutter-plugins-dependencies b/example/.flutter-plugins-dependencies new file mode 100644 index 0000000..5320703 --- /dev/null +++ b/example/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"mmkv_flutter","path":"/Users/mvmtv/Desktop/workspace/mmkv_flutter/","dependencies":[]}],"android":[{"name":"mmkv_flutter","path":"/Users/mvmtv/Desktop/workspace/mmkv_flutter/","dependencies":[]}],"macos":[],"linux":[],"windows":[],"web":[]},"dependencyGraph":[{"name":"mmkv_flutter","dependencies":[]}],"date_created":"2020-10-10 12:38:06.464656","version":"1.20.4-0.0.pre.1"} \ No newline at end of file diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index ee29e60..9661012 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + android:name="flutterEmbedding" + android:value="2" /> + + + + + + diff --git a/example/android/app/src/main/java/com/bigbug/mmkvflutterexample/MainActivity.java b/example/android/app/src/main/java/com/bigbug/mmkvflutterexample/MainActivity.java index 7f03ef2..502761b 100644 --- a/example/android/app/src/main/java/com/bigbug/mmkvflutterexample/MainActivity.java +++ b/example/android/app/src/main/java/com/bigbug/mmkvflutterexample/MainActivity.java @@ -1,13 +1,14 @@ package com.bigbug.mmkvflutterexample; -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; +//import android.os.Bundle; +//import io.flutter.app.FlutterActivity; +import io.flutter.embedding.android.FlutterActivity; +//import io.flutter.plugins.GeneratedPluginRegistrant; public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } +// @Override +// protected void onCreate(Bundle savedInstanceState) { +// super.onCreate(savedInstanceState); +// GeneratedPluginRegistrant.registerWith(this); +// } } diff --git a/example/android/build.gradle b/example/android/build.gradle index d4225c7..6bc1cb8 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:4.0.2' } } diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 9372d0f..a502cd4 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Sat Oct 10 12:23:16 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/example/ios/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id new file mode 100644 index 0000000..4d52b45 --- /dev/null +++ b/example/ios/Flutter/.last_build_id @@ -0,0 +1 @@ +9744f32a1a655588a566b777b261d440 \ No newline at end of file diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec new file mode 100644 index 0000000..5ca3041 --- /dev/null +++ b/example/ios/Flutter/Flutter.podspec @@ -0,0 +1,18 @@ +# +# NOTE: This podspec is NOT to be published. It is only used as a local source! +# + +Pod::Spec.new do |s| + s.name = 'Flutter' + s.version = '1.0.0' + s.summary = 'High-performance, high-fidelity mobile apps.' + s.description = <<-DESC +Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS. + DESC + s.homepage = 'https://flutter.io' + s.license = { :type => 'MIT' } + s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } + s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } + s.ios.deployment_target = '8.0' + s.vendored_frameworks = 'Flutter.framework' +end diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..f6fc03a --- /dev/null +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,16 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/mvmtv/Desktop/Flutter/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/mvmtv/Desktop/workspace/mmkv_flutter/example" +export "FLUTTER_TARGET=/Users/mvmtv/Desktop/workspace/mmkv_flutter/example/lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build/ios" +export "OTHER_LDFLAGS=$(inherited) -framework Flutter" +export "FLUTTER_FRAMEWORK_DIR=/Users/mvmtv/Desktop/Flutter/flutter/bin/cache/artifacts/engine/ios" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_DEFINES=flutter.inspector.structuredErrors%3Dtrue" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.packages" diff --git a/example/ios/Podfile b/example/ios/Podfile index 7c6cb6f..f7d6a5e 100644 --- a/example/ios/Podfile +++ b/example/ios/Podfile @@ -4,60 +4,35 @@ # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches end - pods_ary = [] - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) { |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - pods_ary.push({:name => podname, :path => podpath}); - else - puts "Invalid plugin specification: #{line}" - end - } - return pods_ary + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + target 'Runner' do - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - - # Flutter Pods - generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') - if generated_xcode_build_settings.empty? - puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." - end - generated_xcode_build_settings.map { |p| - if p[:name] == 'FLUTTER_FRAMEWORK_DIR' - symlink = File.join('.symlinks', 'flutter') - File.symlink(File.dirname(p[:path]), symlink) - pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) - end - } - - # Plugin Pods - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.map { |p| - symlink = File.join('.symlinks', 'plugins', p[:name]) - File.symlink(p[:path], symlink) - pod p[:name], :path => File.join(symlink, 'ios') - } + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end post_install do |installer| installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end + flutter_additional_ios_build_settings(target) end end diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 0b95d03..4be26b5 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,12 +8,7 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; @@ -30,8 +25,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -41,16 +34,15 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; + 46034AA190F4DFD747D2592A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 7CAA0B7A8625E8162A5B61F3 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9162E9EAA653F1380B0A9CC9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -64,8 +56,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, B88BB1FCA920A9E48106390D /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -76,6 +66,8 @@ 12C6940A2F0DDDF55BDD96C2 /* Pods */ = { isa = PBXGroup; children = ( + 46034AA190F4DFD747D2592A /* Pods-Runner.debug.xcconfig */, + 9162E9EAA653F1380B0A9CC9 /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -91,10 +83,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, @@ -211,7 +200,6 @@ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -224,21 +212,17 @@ buildActionMask = 2147483647; files = ( ); - inputFileListPaths = ( - ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${PODS_ROOT}/../Flutter/Flutter.framework", ); name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - ); outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -253,7 +237,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 749C440751E0963E1FA1C321 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -328,7 +312,6 @@ /* Begin XCBuildConfiguration section */ 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -382,7 +365,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 77% rename from example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings rename to example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 949b678..18d9810 100644 --- a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -2,7 +2,7 @@ - BuildSystemType - Original + IDEDidComputeMac32BitWarning + diff --git a/example/lib/main.dart b/example/lib/main.dart index 7995b74..cf88fc9 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -12,7 +12,6 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - _incrementCounter() async { MmkvFlutter mmkv = await MmkvFlutter.getInstance(); int counter = await mmkv.getInt('intKey') + 1; diff --git a/ios/Classes/MmkvFlutterPlugin.h b/ios/Classes/MmkvFlutterPlugin.h index 74da995..adf75da 100644 --- a/ios/Classes/MmkvFlutterPlugin.h +++ b/ios/Classes/MmkvFlutterPlugin.h @@ -1,4 +1,5 @@ #import @interface MmkvFlutterPlugin : NSObject + @end diff --git a/ios/Classes/MmkvFlutterPlugin.m b/ios/Classes/MmkvFlutterPlugin.m index 26fb47e..d6cd1bb 100644 --- a/ios/Classes/MmkvFlutterPlugin.m +++ b/ios/Classes/MmkvFlutterPlugin.m @@ -1,17 +1,23 @@ #import "MmkvFlutterPlugin.h" #import -#define KEY @"key" -#define VALUE @"value" + @interface MmkvFlutterPlugin() + @property (strong,nonatomic) MMKV *mmkv; + @end @implementation MmkvFlutterPlugin --(MMKV*)mmkv{ - if(_mmkv==nil){ +NSString * KEY = @"key"; +NSString * VALUE = @"value"; +NSString * PREFIX = @"mmkv.flutter."; + +- (MMKV*)mmkv{ + if(_mmkv == nil){ + [MMKV initializeMMKV:nil logLevel:(MMKVLogWarning)]; _mmkv = [MMKV defaultMMKV]; } return _mmkv; @@ -19,23 +25,31 @@ -(MMKV*)mmkv{ + (void)registerWithRegistrar:(NSObject*)registrar { - FlutterMethodChannel* channel = [FlutterMethodChannel - methodChannelWithName:@"mmkv_flutter" - binaryMessenger:[registrar messenger]]; - MmkvFlutterPlugin* instance = [[MmkvFlutterPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"mmkv_flutter" + binaryMessenger:[registrar messenger]]; + MmkvFlutterPlugin* instance = [[MmkvFlutterPlugin alloc] init]; + [registrar addMethodCallDelegate:instance channel:channel]; + + if (dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL) == dispatch_queue_get_label(dispatch_get_main_queue())) { + [instance mmkv]; + } else { + dispatch_async(dispatch_get_main_queue(), ^{ + [instance mmkv]; + }); + } } - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { NSString *method = [call method]; NSDictionary *arguments = [call arguments]; - + if([method isEqualToString:@"setBool"]){ NSString *key = arguments[KEY]; NSNumber *value = arguments[VALUE]; [self.mmkv setBool:value.boolValue forKey:key]; result(@YES); - }else if([method isEqualToString:@"getBool"]){ + } else if([method isEqualToString:@"getBool"]){ NSString *key = arguments[KEY]; bool res = [self.mmkv getBoolForKey:key]; result([NSNumber numberWithBool:res]); @@ -44,7 +58,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { NSNumber *value = arguments[VALUE]; [self.mmkv setInt32: value.intValue forKey:key]; result(@YES); - }else if([method isEqualToString:@"getInt"]){ + } else if([method isEqualToString:@"getInt"]){ NSString *key = arguments[KEY]; int res = [self.mmkv getInt32ForKey:key]; result([NSNumber numberWithInt:res]); @@ -53,7 +67,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { NSNumber *value = arguments[VALUE]; [self.mmkv setInt64:value.longValue forKey:key]; result(@YES); - }else if([method isEqualToString:@"getLong"]){ + } else if([method isEqualToString:@"getLong"]){ NSString *key = arguments[KEY]; long res = [self.mmkv getInt64ForKey:key]; result([NSNumber numberWithLong:res]); @@ -62,7 +76,7 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { NSNumber *value = arguments[VALUE]; [self.mmkv setDouble:value.doubleValue forKey:key]; result(@YES); - }else if([method isEqualToString:@"getDouble"]){ + } else if([method isEqualToString:@"getDouble"]){ NSString *key = arguments[KEY]; double res = [self.mmkv getDoubleForKey:key]; result([NSNumber numberWithDouble:res]); @@ -71,19 +85,28 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { NSString *value = arguments[VALUE]; [self.mmkv setObject:value forKey:key]; result(@YES); - }else if([method isEqualToString:@"getString"]){ + } else if([method isEqualToString:@"getString"]){ NSString *key = arguments[KEY]; NSString *res = (NSString *)[self.mmkv getObjectOfClass:NSString.class forKey:key]; - if(res==nil){ - res=@""; - } - result(res); + result(res ? res : @""); } else if([method isEqualToString:@"removeByKey"]){ NSString *key = arguments[KEY]; [self.mmkv removeValueForKey:key]; result(@YES); - }else if([method isEqualToString:@"clear"]){ - [self.mmkv clearAll]; + } else if([method isEqualToString:@"clear"]){ + BOOL prefixing = [arguments[@"prefixing"] boolValue]; + if (prefixing == false) { + [self.mmkv clearAll]; + } else { + NSArray * keys = self.mmkv.allKeys.copy; + [keys enumerateObjectsUsingBlock:^(NSString * _Nonnull key, + NSUInteger idx, + BOOL * _Nonnull stop) { + if ([key hasPrefix:PREFIX]) { + [self.mmkv removeValueForKey:key]; + } + }]; + } result(@YES); } else { result(FlutterMethodNotImplemented); diff --git a/ios/mmkv_flutter.podspec b/ios/mmkv_flutter.podspec index 39df57f..3e93f77 100644 --- a/ios/mmkv_flutter.podspec +++ b/ios/mmkv_flutter.podspec @@ -3,7 +3,7 @@ # Pod::Spec.new do |s| s.name = 'mmkv_flutter' - s.version = '0.0.1' + s.version = '0.0.2' s.summary = 'A new flutter plugin project.' s.description = <<-DESC A new flutter plugin project. diff --git a/lib/mmkv_flutter.dart b/lib/mmkv_flutter.dart index 98424b7..5b4b5e7 100644 --- a/lib/mmkv_flutter.dart +++ b/lib/mmkv_flutter.dart @@ -25,12 +25,16 @@ class MmkvFlutter { } /// Reads a value from persistent storage, throwing an exception if it's not a bool. - Future getBool(String key) async{ + Future getBool(String key) async { if (_mmkvCache.containsKey(key)) { return _mmkvCache[key]; } else { - final Map params = {KEY: '$_prefix$key'}; - return await _channel.invokeMethod('getBool', params).then((result){ + final Map params = { + KEY: '$_prefix$key' + }; + return await _channel + .invokeMethod('getBool', params) + .then((result) { _mmkvCache[key] = result; return result; }); @@ -38,14 +42,16 @@ class MmkvFlutter { } /// Reads a value from persistent storage, throwing an exception if it's not an int. - Future getInt(String key) async{ + Future getInt(String key) async { if (_mmkvCache.containsKey(key)) { print('get value from catch'); return _mmkvCache[key]; } else { print('get value from channel'); - final Map params = {KEY: '$_prefix$key'}; - return await _channel.invokeMethod('getInt', params).then((result){ + final Map params = { + KEY: '$_prefix$key' + }; + return await _channel.invokeMethod('getInt', params).then((result) { _mmkvCache[key] = result; return result; }); @@ -53,12 +59,14 @@ class MmkvFlutter { } /// Reads a value from persistent storage, throwing an exception if it's not a long. - Future getLong(String key)async{ + Future getLong(String key) async { if (_mmkvCache.containsKey(key)) { return _mmkvCache[key]; } else { - final Map params = {KEY: '$_prefix$key'}; - return await _channel.invokeMethod('getLong', params).then((result){ + final Map params = { + KEY: '$_prefix$key' + }; + return await _channel.invokeMethod('getLong', params).then((result) { _mmkvCache[key] = result; return result; }); @@ -66,12 +74,16 @@ class MmkvFlutter { } /// Reads a value from persistent storage, throwing an exception if it's not a double. - Future getDouble(String key)async{ + Future getDouble(String key) async { if (_mmkvCache.containsKey(key)) { return _mmkvCache[key]; } else { - final Map params = {KEY: '$_prefix$key'}; - return await _channel.invokeMethod('getDouble', params).then((result){ + final Map params = { + KEY: '$_prefix$key' + }; + return await _channel + .invokeMethod('getDouble', params) + .then((result) { _mmkvCache[key] = result; return result; }); @@ -79,20 +91,22 @@ class MmkvFlutter { } /// Reads a value from persistent storage, throwing an exception if it's not a string. - Future getString(String key)async{ + Future getString(String key) async { if (_mmkvCache.containsKey(key)) { return _mmkvCache[key]; } else { - final Map params = {KEY: '$_prefix$key'}; - return await _channel.invokeMethod('getString', params).then((result){ + final Map params = { + KEY: '$_prefix$key' + }; + return await _channel + .invokeMethod('getString', params) + .then((result) { _mmkvCache[key] = result; return result; }); } } - - /// Saves a boolean [value] to persistent storage in the background. /// /// If [value] is null, this is equivalent to calling [removeByKey()] on the [key]. @@ -111,32 +125,46 @@ class MmkvFlutter { /// Saves a double [value] to persistent storage in the background. /// /// If [value] is null, this is equivalent to calling [removeByKey()] on the [key]. - Future setDouble(String key, double value) => _setValue('Double', key, value); + Future setDouble(String key, double value) => + _setValue('Double', key, value); /// Saves a string [value] to persistent storage in the background. /// /// If [value] is null, this is equivalent to calling [removeByKey()] on the [key]. - Future setString(String key, String value) => _setValue('String', key, value); + Future setString(String key, String value) => + _setValue('String', key, value); /// Removes an entry from persistent storage. Future removeByKey(String key) => _setValue(null, key, null); + /// Removes an entry from memory cache only + /// 新增:只删Flutter侧的缓存 + Future removeMemoryCacheByKey(String key) => _mmkvCache.remove(key); + Future _setValue(String valueType, String key, Object value) async { final Map params = {KEY: '$_prefix$key'}; if (value == null) { _mmkvCache.remove(key); - return await _channel.invokeMethod('removeByKey', params).then((dynamic result) => result); + return await _channel + .invokeMethod('removeByKey', params) + .then((dynamic result) => result); } else { _mmkvCache[key] = value; params[VALUE] = value; - return await _channel.invokeMethod('set$valueType', params).then((dynamic result) => result); + return await _channel + .invokeMethod('set$valueType', params) + .then((dynamic result) => result); } } /// Completes with true once the user preferences for the app has been cleared. - Future clear() async { + Future clear({bool prefixing = true}) async { _mmkvCache.clear(); - return await _channel.invokeMethod('clear'); + + /// 改动:指定删除带有'mmkv.flutter.'前缀的key + /// 旧版本默认删整个'defaultMMKV'里面的内容,容易影响到原生 + final Map params = {'prefixing': prefixing}; + return await _channel.invokeMethod('clear', params); } } diff --git a/pubspec.yaml b/pubspec.yaml index c641eb9..b441af7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,11 +1,11 @@ name: mmkv_flutter description: Get or set persistent storage value base on MMKV framework. -version: 1.0.10 +version: 1.1.2 author: BigBug homepage: https://github.com/yuyongmao/mmkv_flutter environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" + sdk: ">=2.7.0 <3.0.0" dependencies: flutter: From 119468321b03e3aa495565f87810fe9f77141c3e Mon Sep 17 00:00:00 2001 From: jk Date: Sat, 10 Oct 2020 12:46:39 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ab739b3..2a42c1e 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,11 @@ Open terminal, cd to your project directory, run pod repo update to make CocoaPo print('GetSetStringTest value is $stringtest'); await mmkv.setString('stringKey', stringtest); -``` \ No newline at end of file +``` + +## Change Log + +**1.1.2** `2020.10.10` + +> * 新增仅删除Flutter侧缓存(remove from flutter mmkvCache) +> * 执行clear操作时,默认删除带'mmkv.flutter.'前缀的key,不会清空defaultMMKV缓存池 From 31a3a1e529d7e93e35ca988f88eb0ca952bbe007 Mon Sep 17 00:00:00 2001 From: jk Date: Sat, 10 Oct 2020 13:29:37 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=9B=B4=E6=96=B0pub?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 ++++++- pubspec.yaml | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6eefd3..b83dca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ -## 1.0.10 +## [1.0.10] - TODO: Add release date. * 第一个版本 与 MMKV 开源项目的版本号保持一致 + +## [1.1.2] - TODO: 2020-10-10 + +* 新增仅删除Flutter侧缓存(remove from flutter mmkvCache) +* 执行clear操作时,默认删除带'mmkv.flutter.'前缀的key,不会清空defaultMMKV缓存池 \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index b441af7..befcb2c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,6 +6,7 @@ homepage: https://github.com/yuyongmao/mmkv_flutter environment: sdk: ">=2.7.0 <3.0.0" + flutter: ">=1.17.0 <2.0.0" dependencies: flutter: @@ -17,8 +18,12 @@ dependencies: # The following section is specific to Flutter. flutter: plugin: - androidPackage: com.bigbug.mmkvflutter - pluginClass: MmkvFlutterPlugin + platforms: + android: + package: com.bigbug.mmkvflutter + pluginClass: MmkvFlutterPlugin + ios: + pluginClass: MmkvFlutterPlugin # To add assets to your plugin package, add an assets section, like this: # assets: