[shared_preferences] Adds new clearWithParameters and getAllWithParameters methods to all platforms. (#4262)

Adds new `clearWithParameters` and `getAllWithParameters` methods.

part of https://github.com/flutter/flutter/issues/128948

precursor to https://github.com/flutter/packages/pull/3794

awaiting https://github.com/flutter/packages/pull/4261

## Pre-launch Checklist

- [x] I read the [Contributor Guide] and followed the process outlined
there for submitting PRs.
- [x] I read the [Tree Hygiene] wiki page, which explains my
responsibilities.
- [x] I read and followed the [relevant style guides] and ran the
auto-formatter. (Unlike the flutter/flutter repo, the flutter/packages
repo does use `dart format`.)
- [x] I signed the [CLA].
- [x] The title of the PR starts with the name of the package surrounded
by square brackets, e.g. `[shared_preferences]`
- [x] I listed at least one issue that this PR fixes in the description
above.
- [x] I updated `pubspec.yaml` with an appropriate new version according
to the [pub versioning philosophy], or this PR is [exempt from version
changes].
- [x] I updated `CHANGELOG.md` to add a description of the change,
[following repository CHANGELOG style].
- [x] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/packages/blob/main/CONTRIBUTING.md
[Tree Hygiene]: https://github.com/flutter/flutter/wiki/Tree-hygiene
[relevant style guides]:
https://github.com/flutter/packages/blob/main/CONTRIBUTING.md#style
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#handling-breaking-changes
[Discord]: https://github.com/flutter/flutter/wiki/Chat
[pub versioning philosophy]: https://dart.dev/tools/pub/versioning
[exempt from version changes]:
https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#version-and-changelog-updates
[following repository CHANGELOG style]:
https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changelog-style
[test-exempt]:
https://github.com/flutter/flutter/wiki/Tree-hygiene#tests
diff --git a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md
index e5dd9bc..37cd5de 100644
--- a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 2.2.0
 
+* Adds `clearWithParameters` and `getAllWithParameters` methods.
 * Updates minimum supported SDK version to Flutter 3.3/Dart 2.18.
 
 ## 2.1.4
diff --git a/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/Messages.java b/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/Messages.java
index 20efb44..26fb795 100644
--- a/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/Messages.java
+++ b/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/Messages.java
@@ -1,7 +1,7 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-// Autogenerated from Pigeon (v9.2.4), do not edit directly.
+// Autogenerated from Pigeon (v9.2.5), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 package io.flutter.plugins.sharedpreferences;
@@ -75,10 +75,10 @@
     Boolean setStringList(@NonNull String key, @NonNull List<String> value);
     /** Removes all properties from shared preferences data set with matching prefix. */
     @NonNull
-    Boolean clearWithPrefix(@NonNull String prefix);
+    Boolean clear(@NonNull String prefix, @Nullable List<String> allowList);
     /** Gets all properties from shared preferences data set with matching prefix. */
     @NonNull
-    Map<String, Object> getAllWithPrefix(@NonNull String prefix);
+    Map<String, Object> getAll(@NonNull String prefix, @Nullable List<String> allowList);
 
     /** The codec used by SharedPreferencesApi. */
     static @NonNull MessageCodec<Object> getCodec() {
@@ -263,7 +263,7 @@
         BasicMessageChannel<Object> channel =
             new BasicMessageChannel<>(
                 binaryMessenger,
-                "dev.flutter.pigeon.SharedPreferencesApi.clearWithPrefix",
+                "dev.flutter.pigeon.SharedPreferencesApi.clear",
                 getCodec(),
                 taskQueue);
         if (api != null) {
@@ -272,8 +272,9 @@
                 ArrayList<Object> wrapped = new ArrayList<Object>();
                 ArrayList<Object> args = (ArrayList<Object>) message;
                 String prefixArg = (String) args.get(0);
+                List<String> allowListArg = (List<String>) args.get(1);
                 try {
-                  Boolean output = api.clearWithPrefix(prefixArg);
+                  Boolean output = api.clear(prefixArg, allowListArg);
                   wrapped.add(0, output);
                 } catch (Throwable exception) {
                   ArrayList<Object> wrappedError = wrapError(exception);
@@ -290,7 +291,7 @@
         BasicMessageChannel<Object> channel =
             new BasicMessageChannel<>(
                 binaryMessenger,
-                "dev.flutter.pigeon.SharedPreferencesApi.getAllWithPrefix",
+                "dev.flutter.pigeon.SharedPreferencesApi.getAll",
                 getCodec(),
                 taskQueue);
         if (api != null) {
@@ -299,8 +300,9 @@
                 ArrayList<Object> wrapped = new ArrayList<Object>();
                 ArrayList<Object> args = (ArrayList<Object>) message;
                 String prefixArg = (String) args.get(0);
+                List<String> allowListArg = (List<String>) args.get(1);
                 try {
-                  Map<String, Object> output = api.getAllWithPrefix(prefixArg);
+                  Map<String, Object> output = api.getAll(prefixArg, allowListArg);
                   wrapped.add(0, output);
                 } catch (Throwable exception) {
                   ArrayList<Object> wrappedError = wrapError(exception);
diff --git a/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java b/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java
index 6f59b72..aecc439 100644
--- a/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java
+++ b/packages/shared_preferences/shared_preferences_android/android/src/main/java/io/flutter/plugins/sharedpreferences/SharedPreferencesPlugin.java
@@ -9,6 +9,7 @@
 import android.util.Base64;
 import android.util.Log;
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import io.flutter.embedding.engine.plugins.FlutterPlugin;
 import io.flutter.plugin.common.BinaryMessenger;
@@ -21,6 +22,7 @@
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -111,18 +113,20 @@
   }
 
   @Override
-  public @NonNull Map<String, Object> getAllWithPrefix(@NonNull String prefix)
-      throws RuntimeException {
-    return getAllPrefs(prefix);
+  public @NonNull Map<String, Object> getAll(
+      @NonNull String prefix, @Nullable List<String> allowList) throws RuntimeException {
+    final Set<String> allowSet = allowList == null ? null : new HashSet<>(allowList);
+    return getAllPrefs(prefix, allowSet);
   }
 
   @Override
-  public @NonNull Boolean clearWithPrefix(@NonNull String prefix) throws RuntimeException {
+  public @NonNull Boolean clear(@NonNull String prefix, @Nullable List<String> allowList)
+      throws RuntimeException {
     SharedPreferences.Editor clearEditor = preferences.edit();
     Map<String, ?> allPrefs = preferences.getAll();
     ArrayList<String> filteredPrefs = new ArrayList<>();
     for (String key : allPrefs.keySet()) {
-      if (key.startsWith(prefix)) {
+      if (key.startsWith(prefix) && (allowList == null || allowList.contains(key))) {
         filteredPrefs.add(key);
       }
     }
@@ -133,12 +137,14 @@
   }
 
   // Gets all shared preferences, filtered to only those set with the given prefix.
+  // Optionally filtered also to only those items in the optional [allowList].
   @SuppressWarnings("unchecked")
-  private @NonNull Map<String, Object> getAllPrefs(@NonNull String prefix) throws RuntimeException {
+  private @NonNull Map<String, Object> getAllPrefs(
+      @NonNull String prefix, @Nullable Set<String> allowList) throws RuntimeException {
     Map<String, ?> allPrefs = preferences.getAll();
     Map<String, Object> filteredPrefs = new HashMap<>();
     for (String key : allPrefs.keySet()) {
-      if (key.startsWith(prefix)) {
+      if (key.startsWith(prefix) && (allowList == null || allowList.contains(key))) {
         filteredPrefs.put(key, transformPref(key, allPrefs.get(key)));
       }
     }
diff --git a/packages/shared_preferences/shared_preferences_android/android/src/test/java/io/flutter/plugins/sharedpreferences/SharedPreferencesTest.java b/packages/shared_preferences/shared_preferences_android/android/src/test/java/io/flutter/plugins/sharedpreferences/SharedPreferencesTest.java
index e793ea4..19debfe 100644
--- a/packages/shared_preferences/shared_preferences_android/android/src/test/java/io/flutter/plugins/sharedpreferences/SharedPreferencesTest.java
+++ b/packages/shared_preferences/shared_preferences_android/android/src/test/java/io/flutter/plugins/sharedpreferences/SharedPreferencesTest.java
@@ -67,12 +67,12 @@
   }
 
   @Test
-  public void getAllWithPrefix() {
-    assertEquals(plugin.getAllWithPrefix("").size(), 0);
+  public void getAll() {
+    assertEquals(plugin.getAll("", null).size(), 0);
 
     addData();
 
-    Map<String, Object> flutterData = plugin.getAllWithPrefix("flutter.");
+    Map<String, Object> flutterData = plugin.getAll("flutter.", null);
 
     assertEquals(flutterData.size(), 5);
     assertEquals(flutterData.get("flutter.Language"), "Java");
@@ -81,17 +81,43 @@
     assertEquals(flutterData.get("flutter.Names"), Arrays.asList("Flutter", "Dart"));
     assertEquals(flutterData.get("flutter.NewToFlutter"), false);
 
-    Map<String, Object> allData = plugin.getAllWithPrefix("");
+    Map<String, Object> allData = plugin.getAll("", null);
 
     assertEquals(allData, data);
   }
 
   @Test
+  public void allowList() {
+    assertEquals(plugin.getAll("", null).size(), 0);
+
+    addData();
+
+    final List<String> allowList = Arrays.asList("flutter.Language");
+
+    Map<String, Object> allData = plugin.getAll("flutter.", allowList);
+
+    assertEquals(allData.size(), 1);
+    assertEquals(allData.get("flutter.Language"), "Java");
+    assertEquals(allData.get("flutter.Counter"), null);
+
+    allData = plugin.getAll("", allowList);
+
+    assertEquals(allData.size(), 1);
+    assertEquals(allData.get("flutter.Language"), "Java");
+    assertEquals(allData.get("flutter.Counter"), null);
+
+    allData = plugin.getAll("prefix.", allowList);
+
+    assertEquals(allData.size(), 0);
+    assertEquals(allData.get("flutter.Language"), null);
+  }
+
+  @Test
   public void setString() {
     final String key = "language";
     final String value = "Java";
     plugin.setString(key, value);
-    Map<String, Object> flutterData = plugin.getAllWithPrefix("");
+    Map<String, Object> flutterData = plugin.getAll("", null);
     assertEquals(flutterData.get(key), value);
   }
 
@@ -100,7 +126,7 @@
     final String key = "Counter";
     final Long value = 0L;
     plugin.setInt(key, value);
-    Map<String, Object> flutterData = plugin.getAllWithPrefix("");
+    Map<String, Object> flutterData = plugin.getAll("", null);
     assertEquals(flutterData.get(key), value);
   }
 
@@ -109,7 +135,7 @@
     final String key = "Pie";
     final double value = 3.14;
     plugin.setDouble(key, value);
-    Map<String, Object> flutterData = plugin.getAllWithPrefix("");
+    Map<String, Object> flutterData = plugin.getAll("", null);
     assertEquals(flutterData.get(key), value);
   }
 
@@ -118,7 +144,7 @@
     final String key = "Names";
     final List<String> value = Arrays.asList("Flutter", "Dart");
     plugin.setStringList(key, value);
-    Map<String, Object> flutterData = plugin.getAllWithPrefix("");
+    Map<String, Object> flutterData = plugin.getAll("", null);
     assertEquals(flutterData.get(key), value);
   }
 
@@ -127,30 +153,41 @@
     final String key = "NewToFlutter";
     final boolean value = false;
     plugin.setBool(key, value);
-    Map<String, Object> flutterData = plugin.getAllWithPrefix("");
+    Map<String, Object> flutterData = plugin.getAll("", null);
     assertEquals(flutterData.get(key), value);
   }
 
   @Test
-  public void clearWithPrefix() {
+  public void clearWithNoAllowList() {
     addData();
 
-    assertEquals(plugin.getAllWithPrefix("").size(), 15);
+    assertEquals(plugin.getAll("", null).size(), 15);
 
-    plugin.clearWithPrefix("flutter.");
+    plugin.clear("flutter.", null);
 
-    assertEquals(plugin.getAllWithPrefix("").size(), 10);
+    assertEquals(plugin.getAll("", null).size(), 10);
+  }
+
+  @Test
+  public void clearWithAllowList() {
+    addData();
+
+    assertEquals(plugin.getAll("", null).size(), 15);
+
+    plugin.clear("flutter.", Arrays.asList("flutter.Language"));
+
+    assertEquals(plugin.getAll("", null).size(), 14);
   }
 
   @Test
   public void clearAll() {
     addData();
 
-    assertEquals(plugin.getAllWithPrefix("").size(), 15);
+    assertEquals(plugin.getAll("", null).size(), 15);
 
-    plugin.clearWithPrefix("");
+    plugin.clear("", null);
 
-    assertEquals(plugin.getAllWithPrefix("").size(), 0);
+    assertEquals(plugin.getAll("", null).size(), 0);
   }
 
   @Test
@@ -158,9 +195,9 @@
     final String key = "NewToFlutter";
     final boolean value = true;
     plugin.setBool(key, value);
-    assert (plugin.getAllWithPrefix("").containsKey(key));
+    assert (plugin.getAll("", null).containsKey(key));
     plugin.remove(key);
-    assertFalse(plugin.getAllWithPrefix("").containsKey(key));
+    assertFalse(plugin.getAll("", null).containsKey(key));
   }
 
   private void addData() {
diff --git a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart
index a08363a..2bb1613 100644
--- a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart
@@ -6,6 +6,7 @@
 import 'package:flutter_test/flutter_test.dart';
 import 'package:integration_test/integration_test.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
@@ -47,14 +48,20 @@
       preferences = SharedPreferencesStorePlatform.instance;
     });
 
-    tearDown(() {
-      // ignore: deprecated_member_use
-      preferences.clearWithPrefix('');
+    tearDown(() async {
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
     });
 
     testWidgets('reading', (WidgetTester _) async {
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values['String'], isNull);
       expect(values['Bool'], isNull);
       expect(values['Int'], isNull);
@@ -62,6 +69,35 @@
       expect(values['StringList'], isNull);
     });
 
+    Future<void> addData() async {
+      await preferences.setValue('String', 'String', allTestValues['String']!);
+      await preferences.setValue('Bool', 'Bool', allTestValues['Bool']!);
+      await preferences.setValue('Int', 'Int', allTestValues['Int']!);
+      await preferences.setValue('Double', 'Double', allTestValues['Double']!);
+      await preferences.setValue(
+          'StringList', 'StringList', allTestValues['StringList']!);
+      await preferences.setValue(
+          'String', 'prefix.String', allTestValues['prefix.String']!);
+      await preferences.setValue(
+          'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!);
+      await preferences.setValue(
+          'Int', 'prefix.Int', allTestValues['prefix.Int']!);
+      await preferences.setValue(
+          'Double', 'prefix.Double', allTestValues['prefix.Double']!);
+      await preferences.setValue('StringList', 'prefix.StringList',
+          allTestValues['prefix.StringList']!);
+      await preferences.setValue(
+          'String', 'flutter.String', allTestValues['flutter.String']!);
+      await preferences.setValue(
+          'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
+      await preferences.setValue(
+          'Int', 'flutter.Int', allTestValues['flutter.Int']!);
+      await preferences.setValue(
+          'Double', 'flutter.Double', allTestValues['flutter.Double']!);
+      await preferences.setValue('StringList', 'flutter.StringList',
+          allTestValues['flutter.StringList']!);
+    }
+
     testWidgets('getAllWithPrefix', (WidgetTester _) async {
       await Future.wait(<Future<bool>>[
         preferences.setValue(
@@ -94,68 +130,160 @@
       expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
     });
 
-    testWidgets('clearWithPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'prefix.String', allTestValues['prefix.String']!),
-        preferences.setValue(
-            'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
-        preferences.setValue('Int', 'prefix.Int', allTestValues['prefix.Int']!),
-        preferences.setValue(
-            'Double', 'prefix.Double', allTestValues['prefix.Double']!),
-        preferences.setValue('StringList', 'prefix.StringList',
-            allTestValues['prefix.StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      // ignore: deprecated_member_use
-      await preferences.clearWithPrefix('prefix.');
-      Map<String, Object> values =
-          // ignore: deprecated_member_use
-          await preferences.getAllWithPrefix('prefix.');
-      expect(values['prefix.String'], null);
+    group('withPrefix', () {
+      testWidgets('clearWithPrefix', (WidgetTester _) async {
+        await Future.wait(<Future<bool>>[
+          preferences.setValue(
+              'String', 'prefix.String', allTestValues['prefix.String']!),
+          preferences.setValue(
+              'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
+          preferences.setValue(
+              'Int', 'prefix.Int', allTestValues['prefix.Int']!),
+          preferences.setValue(
+              'Double', 'prefix.Double', allTestValues['prefix.Double']!),
+          preferences.setValue('StringList', 'prefix.StringList',
+              allTestValues['prefix.StringList']!),
+          preferences.setValue(
+              'String', 'flutter.String', allTestValues['flutter.String']!),
+          preferences.setValue(
+              'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
+          preferences.setValue(
+              'Int', 'flutter.Int', allTestValues['flutter.Int']!),
+          preferences.setValue(
+              'Double', 'flutter.Double', allTestValues['flutter.Double']!),
+          preferences.setValue('StringList', 'flutter.StringList',
+              allTestValues['flutter.StringList']!)
+        ]);
+        // ignore: deprecated_member_use
+        await preferences.clearWithPrefix('prefix.');
+        Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('prefix.');
+        expect(values['prefix.String'], null);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+        // ignore: deprecated_member_use
+        values = await preferences.getAllWithPrefix('flutter.');
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+        await Future.wait(<Future<bool>>[
+          preferences.setValue('String', 'String', allTestValues['String']!),
+          preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
+          preferences.setValue('Int', 'Int', allTestValues['Int']!),
+          preferences.setValue('Double', 'Double', allTestValues['Double']!),
+          preferences.setValue(
+              'StringList', 'StringList', allTestValues['StringList']!),
+          preferences.setValue(
+              'String', 'flutter.String', allTestValues['flutter.String']!),
+          preferences.setValue(
+              'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
+          preferences.setValue(
+              'Int', 'flutter.Int', allTestValues['flutter.Int']!),
+          preferences.setValue(
+              'Double', 'flutter.Double', allTestValues['flutter.Double']!),
+          preferences.setValue('StringList', 'flutter.StringList',
+              allTestValues['flutter.StringList']!)
+        ]);
+        final Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], allTestValues['String']);
+        expect(values['Bool'], allTestValues['Bool']);
+        expect(values['Int'], allTestValues['Int']);
+        expect(values['Double'], allTestValues['Double']);
+        expect(values['StringList'], allTestValues['StringList']);
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithNoPrefix', (WidgetTester _) async {
+        await Future.wait(<Future<bool>>[
+          preferences.setValue('String', 'String', allTestValues['String']!),
+          preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
+          preferences.setValue('Int', 'Int', allTestValues['Int']!),
+          preferences.setValue('Double', 'Double', allTestValues['Double']!),
+          preferences.setValue(
+              'StringList', 'StringList', allTestValues['StringList']!),
+          preferences.setValue(
+              'String', 'flutter.String', allTestValues['flutter.String']!),
+          preferences.setValue(
+              'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
+          preferences.setValue(
+              'Int', 'flutter.Int', allTestValues['flutter.Int']!),
+          preferences.setValue(
+              'Double', 'flutter.Double', allTestValues['flutter.Double']!),
+          preferences.setValue('StringList', 'flutter.StringList',
+              allTestValues['flutter.StringList']!)
+        ]);
+        // ignore: deprecated_member_use
+        await preferences.clearWithPrefix('');
+        final Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], null);
+        expect(values['Bool'], null);
+        expect(values['Int'], null);
+        expect(values['Double'], null);
+        expect(values['StringList'], null);
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
+    });
+
+    testWidgets('get all with prefix', (WidgetTester _) async {
+      await addData();
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      expect(values['prefix.String'], allTestValues['prefix.String']);
+      expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+      expect(values['prefix.Int'], allTestValues['prefix.Int']);
+      expect(values['prefix.Double'], allTestValues['prefix.Double']);
+      expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+    });
+
+    testWidgets('get all with allow list', (WidgetTester _) async {
+      await addData();
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(
+            prefix: 'prefix.',
+            allowList: <String>{'prefix.String'},
+          ),
+        ),
+      );
+      expect(values['prefix.String'], allTestValues['prefix.String']);
       expect(values['prefix.Bool'], null);
       expect(values['prefix.Int'], null);
       expect(values['prefix.Double'], null);
       expect(values['prefix.StringList'], null);
-      // ignore: deprecated_member_use
-      values = await preferences.getAllWithPrefix('flutter.');
-      expect(values['flutter.String'], allTestValues['flutter.String']);
-      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
-      expect(values['flutter.Int'], allTestValues['flutter.Int']);
-      expect(values['flutter.Double'], allTestValues['flutter.Double']);
-      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
     });
 
     testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue('String', 'String', allTestValues['String']!),
-        preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
-        preferences.setValue('Int', 'Int', allTestValues['Int']!),
-        preferences.setValue('Double', 'Double', allTestValues['Double']!),
-        preferences.setValue(
-            'StringList', 'StringList', allTestValues['StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      await addData();
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values['String'], allTestValues['String']);
       expect(values['Bool'], allTestValues['Bool']);
       expect(values['Int'], allTestValues['Int']);
@@ -168,29 +296,84 @@
       expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
     });
 
+    testWidgets('clearWithParameters', (WidgetTester _) async {
+      await addData();
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      expect(values['prefix.String'], null);
+      expect(values['prefix.Bool'], null);
+      expect(values['prefix.Int'], null);
+      expect(values['prefix.Double'], null);
+      expect(values['prefix.StringList'], null);
+      values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'flutter.'),
+        ),
+      );
+      expect(values['flutter.String'], allTestValues['flutter.String']);
+      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+      expect(values['flutter.Int'], allTestValues['flutter.Int']);
+      expect(values['flutter.Double'], allTestValues['flutter.Double']);
+      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
+    });
+
+    testWidgets('clearWithParameters with allow list', (WidgetTester _) async {
+      await addData();
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(
+            prefix: 'prefix.',
+            allowList: <String>{
+              'prefix.Double',
+              'prefix.Int',
+              'prefix.Bool',
+              'prefix.String',
+            },
+          ),
+        ),
+      );
+      Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      expect(values['prefix.String'], null);
+      expect(values['prefix.Bool'], null);
+      expect(values['prefix.Int'], null);
+      expect(values['prefix.Double'], null);
+      expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+      values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'flutter.'),
+        ),
+      );
+      expect(values['flutter.String'], allTestValues['flutter.String']);
+      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+      expect(values['flutter.Int'], allTestValues['flutter.Int']);
+      expect(values['flutter.Double'], allTestValues['flutter.Double']);
+      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
+    });
+
     testWidgets('clearWithNoPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue('String', 'String', allTestValues['String']!),
-        preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
-        preferences.setValue('Int', 'Int', allTestValues['Int']!),
-        preferences.setValue('Double', 'Double', allTestValues['Double']!),
-        preferences.setValue(
-            'StringList', 'StringList', allTestValues['StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      // ignore: deprecated_member_use
-      await preferences.clearWithPrefix('');
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      await addData();
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values['String'], null);
       expect(values['Bool'], null);
       expect(values['Int'], null);
@@ -204,18 +387,16 @@
     });
 
     testWidgets('getAll', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
+      await preferences.setValue(
+          'String', 'flutter.String', allTestValues['flutter.String']!);
+      await preferences.setValue(
+          'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
+      await preferences.setValue(
+          'Int', 'flutter.Int', allTestValues['flutter.Int']!);
+      await preferences.setValue(
+          'Double', 'flutter.Double', allTestValues['flutter.Double']!);
+      await preferences.setValue('StringList', 'flutter.StringList',
+          allTestValues['flutter.StringList']!);
       final Map<String, Object> values = await preferences.getAll();
       expect(values['flutter.String'], allTestValues['flutter.String']);
       expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
@@ -235,8 +416,11 @@
       await preferences.setValue(
           'StringList', key, allTestValues['flutter.StringList']!);
       await preferences.remove(key);
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values[key], isNull);
     });
 
@@ -270,8 +454,11 @@
       // All writes should succeed.
       expect(result.where((bool element) => !element), isEmpty);
       // The last write should win.
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values['Int'], writeCount);
     });
 
@@ -279,8 +466,11 @@
         (WidgetTester _) async {
       const String key = 'akey';
       const String value = 'a string value';
-      // ignore: deprecated_member_use
-      await preferences.clearWithPrefix('');
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
 
       // Special prefixes used to store datatypes that can't be stored directly
       // in SharedPreferences as strings instead.
@@ -296,8 +486,11 @@
         expect(preferences.setValue('String', key, prefix + value),
             throwsA(isA<PlatformException>()));
         final Map<String, Object> values =
-            // ignore: deprecated_member_use
-            await preferences.getAllWithPrefix('');
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
         expect(values[key], null);
       }
     });
diff --git a/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml
index 3445345..49065b1 100644
--- a/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml
@@ -16,7 +16,7 @@
     # The example app is bundled with the plugin so we use a path dependency on
     # the parent directory to use the current plugin's version.
     path: ../
-  shared_preferences_platform_interface: ^2.0.0
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_driver:
diff --git a/packages/shared_preferences/shared_preferences_android/lib/shared_preferences_android.dart b/packages/shared_preferences/shared_preferences_android/lib/shared_preferences_android.dart
index 9c26a03..352d364 100644
--- a/packages/shared_preferences/shared_preferences_android/lib/shared_preferences_android.dart
+++ b/packages/shared_preferences/shared_preferences_android/lib/shared_preferences_android.dart
@@ -5,6 +5,7 @@
 import 'package:flutter/foundation.dart';
 import 'package:flutter/services.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 import 'src/messages.g.dart';
 
@@ -52,23 +53,50 @@
   }
 
   @override
-  Future<bool> clear() {
-    return clearWithPrefix(_defaultPrefix);
+  Future<bool> clear() async {
+    return clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<bool> clearWithPrefix(String prefix) async {
-    return _api.clearWithPrefix(prefix);
+    return clearWithParameters(
+        ClearParameters(filter: PreferencesFilter(prefix: prefix)));
   }
 
   @override
-  Future<Map<String, Object>> getAll() {
-    return getAllWithPrefix(_defaultPrefix);
+  Future<bool> clearWithParameters(ClearParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
+    return _api.clear(
+      filter.prefix,
+      filter.allowList?.toList(),
+    );
+  }
+
+  @override
+  Future<Map<String, Object>> getAll() async {
+    return getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<Map<String, Object>> getAllWithPrefix(String prefix) async {
-    final Map<String?, Object?> data = await _api.getAllWithPrefix(prefix);
+    return getAllWithParameters(
+        GetAllParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<Map<String, Object>> getAllWithParameters(
+      GetAllParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
+    final Map<String?, Object?> data =
+        await _api.getAll(filter.prefix, filter.allowList?.toList());
     return data.cast<String, Object>();
   }
 }
diff --git a/packages/shared_preferences/shared_preferences_android/lib/src/messages.g.dart b/packages/shared_preferences/shared_preferences_android/lib/src/messages.g.dart
index 4bb59d6..1e84309 100644
--- a/packages/shared_preferences/shared_preferences_android/lib/src/messages.g.dart
+++ b/packages/shared_preferences/shared_preferences_android/lib/src/messages.g.dart
@@ -1,7 +1,7 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-// Autogenerated from Pigeon (v9.2.4), do not edit directly.
+// Autogenerated from Pigeon (v9.2.5), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import
 
@@ -190,12 +190,12 @@
   }
 
   /// Removes all properties from shared preferences data set with matching prefix.
-  Future<bool> clearWithPrefix(String arg_prefix) async {
+  Future<bool> clear(String arg_prefix, List<String?>? arg_allowList) async {
     final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.SharedPreferencesApi.clearWithPrefix', codec,
+        'dev.flutter.pigeon.SharedPreferencesApi.clear', codec,
         binaryMessenger: _binaryMessenger);
-    final List<Object?>? replyList =
-        await channel.send(<Object?>[arg_prefix]) as List<Object?>?;
+    final List<Object?>? replyList = await channel
+        .send(<Object?>[arg_prefix, arg_allowList]) as List<Object?>?;
     if (replyList == null) {
       throw PlatformException(
         code: 'channel-error',
@@ -218,12 +218,13 @@
   }
 
   /// Gets all properties from shared preferences data set with matching prefix.
-  Future<Map<String?, Object?>> getAllWithPrefix(String arg_prefix) async {
+  Future<Map<String?, Object?>> getAll(
+      String arg_prefix, List<String?>? arg_allowList) async {
     final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.SharedPreferencesApi.getAllWithPrefix', codec,
+        'dev.flutter.pigeon.SharedPreferencesApi.getAll', codec,
         binaryMessenger: _binaryMessenger);
-    final List<Object?>? replyList =
-        await channel.send(<Object?>[arg_prefix]) as List<Object?>?;
+    final List<Object?>? replyList = await channel
+        .send(<Object?>[arg_prefix, arg_allowList]) as List<Object?>?;
     if (replyList == null) {
       throw PlatformException(
         code: 'channel-error',
diff --git a/packages/shared_preferences/shared_preferences_android/pigeons/messages.dart b/packages/shared_preferences/shared_preferences_android/pigeons/messages.dart
index 6bff147..e359c32 100644
--- a/packages/shared_preferences/shared_preferences_android/pigeons/messages.dart
+++ b/packages/shared_preferences/shared_preferences_android/pigeons/messages.dart
@@ -41,9 +41,15 @@
 
   /// Removes all properties from shared preferences data set with matching prefix.
   @TaskQueue(type: TaskQueueType.serialBackgroundThread)
-  bool clearWithPrefix(String prefix);
+  bool clear(
+    String prefix,
+    List<String>? allowList,
+  );
 
   /// Gets all properties from shared preferences data set with matching prefix.
   @TaskQueue(type: TaskQueueType.serialBackgroundThread)
-  Map<String, Object> getAllWithPrefix(String prefix);
+  Map<String, Object> getAll(
+    String prefix,
+    List<String>? allowList,
+  );
 }
diff --git a/packages/shared_preferences/shared_preferences_android/pubspec.yaml b/packages/shared_preferences/shared_preferences_android/pubspec.yaml
index 36fc4f4..895b2b6 100644
--- a/packages/shared_preferences/shared_preferences_android/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_android/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Android implementation of the shared_preferences plugin
 repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_android
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.1.4
+version: 2.2.0
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -20,7 +20,7 @@
 dependencies:
   flutter:
     sdk: flutter
-  shared_preferences_platform_interface: ^2.2.0
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart b/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart
index 2c50304..421ccfe 100644
--- a/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart
+++ b/packages/shared_preferences/shared_preferences_android/test/shared_preferences_android_test.dart
@@ -7,6 +7,7 @@
 import 'package:shared_preferences_android/shared_preferences_android.dart';
 import 'package:shared_preferences_android/src/messages.g.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 void main() {
   TestWidgetsFlutterBinding.ensureInitialized();
@@ -80,6 +81,61 @@
     expect(all.length, 0);
   });
 
+  test('clearWithParameters', () async {
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+
+    Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 5);
+    await plugin.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    all = await plugin.getAll();
+    expect(all.length, 5);
+    all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 0);
+  });
+
+  test('clearWithParameters with allow list', () async {
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+
+    Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 5);
+    await plugin.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.StringList'},
+        ),
+      ),
+    );
+    all = await plugin.getAll();
+    expect(all.length, 5);
+    all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 4);
+  });
+
   test('getAll', () async {
     for (final String key in flutterTestValues.keys) {
       api.items[key] = flutterTestValues[key]!;
@@ -89,15 +145,56 @@
     expect(all, flutterTestValues);
   });
 
-  test('getAllWithPrefix', () async {
+  test('getAllWithNoPrefix', () async {
     for (final String key in allTestValues.keys) {
       api.items[key] = allTestValues[key]!;
     }
-    final Map<String?, Object?> all = await plugin.getAllWithPrefix('prefix.');
+    final Map<String?, Object?> all = await plugin.getAllWithPrefix('');
+    expect(all.length, 15);
+    expect(all, allTestValues);
+  });
+
+  test('clearWithNoPrefix', () async {
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+
+    Map<String?, Object?> all = await plugin.getAllWithPrefix('');
+    expect(all.length, 15);
+    await plugin.clearWithPrefix('');
+    all = await plugin.getAllWithPrefix('');
+    expect(all.length, 0);
+  });
+
+  test('getAllWithParameters', () async {
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+    final Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
     expect(all.length, 5);
     expect(all, prefixTestValues);
   });
 
+  test('getAllWithParameters with allow list', () async {
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+    final Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.Bool'},
+        ),
+      ),
+    );
+    expect(all.length, 1);
+    expect(all['prefix.Bool'], true);
+  });
+
   test('setValue', () async {
     expect(await plugin.setValue('Bool', 'flutter.Bool', true), isTrue);
     expect(api.items['flutter.Bool'], true);
@@ -124,7 +221,11 @@
     for (final String key in allTestValues.keys) {
       api.items[key] = allTestValues[key]!;
     }
-    final Map<String?, Object?> all = await plugin.getAllWithPrefix('');
+    final Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
     expect(all.length, 15);
     expect(all, allTestValues);
   });
@@ -134,10 +235,22 @@
       api.items[key] = allTestValues[key]!;
     }
 
-    Map<String?, Object?> all = await plugin.getAllWithPrefix('');
+    Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
     expect(all.length, 15);
-    await plugin.clearWithPrefix('');
-    all = await plugin.getAllWithPrefix('');
+    await plugin.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
     expect(all.length, 0);
   });
 }
@@ -146,10 +259,19 @@
   final Map<String, Object> items = <String, Object>{};
 
   @override
-  Future<Map<String?, Object?>> getAllWithPrefix(String prefix) async {
+  Future<Map<String?, Object?>> getAll(
+    String prefix,
+    List<String?>? allowList,
+  ) async {
+    Set<String?>? allowSet;
+    if (allowList != null) {
+      allowSet = Set<String>.from(allowList);
+    }
     return <String?, Object?>{
       for (final String key in items.keys)
-        if (key.startsWith(prefix)) key: items[key]
+        if (key.startsWith(prefix) &&
+            (allowSet == null || allowSet.contains(key)))
+          key: items[key]
     };
   }
 
@@ -172,9 +294,10 @@
   }
 
   @override
-  Future<bool> clearWithPrefix(String prefix) async {
+  Future<bool> clear(String prefix, List<String?>? allowList) async {
     items.keys.toList().forEach((String key) {
-      if (key.startsWith(prefix)) {
+      if (key.startsWith(prefix) &&
+          (allowList == null || allowList.contains(key))) {
         items.remove(key);
       }
     });
diff --git a/packages/shared_preferences/shared_preferences_foundation/CHANGELOG.md b/packages/shared_preferences/shared_preferences_foundation/CHANGELOG.md
index 6d7777d..d68c111 100644
--- a/packages/shared_preferences/shared_preferences_foundation/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_foundation/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 2.3.0
 
+* Adds `clearWithParameters` and `getAllWithParameters` methods.
 * Updates minimum supported macOS version to 10.14.
 * Updates minimum supported SDK version to Flutter 3.3/Dart 2.18.
 
diff --git a/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/SharedPreferencesPlugin.swift b/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/SharedPreferencesPlugin.swift
index b334f68..bb91ca0 100644
--- a/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/SharedPreferencesPlugin.swift
+++ b/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/SharedPreferencesPlugin.swift
@@ -22,8 +22,8 @@
     UserDefaultsApiSetup.setUp(binaryMessenger: messenger, api: instance)
   }
 
-  func getAllWithPrefix(prefix: String) -> [String? : Any?] {
-    return getAllPrefs(prefix: prefix)
+  func getAll(prefix: String, allowList: [String]?) -> [String? : Any?] {
+    return getAllPrefs(prefix: prefix, allowList: allowList)
   }
 
   func setBool(key: String, value: Bool) {
@@ -42,20 +42,26 @@
     UserDefaults.standard.removeObject(forKey: key)
   }
 
-  func clearWithPrefix(prefix: String) {
+  func clear(prefix: String, allowList: [String]?) -> Bool {
     let defaults = UserDefaults.standard
-    for (key, _) in getAllPrefs(prefix: prefix) {
+    for (key, _) in getAllPrefs(prefix: prefix, allowList: allowList) {
       defaults.removeObject(forKey: key)
     }
+      return true
   }
 
   /// Returns all preferences stored with specified prefix.
-  func getAllPrefs(prefix: String) -> [String: Any] {
+  /// If [allowList] is included, only items included will be returned.
+  func getAllPrefs(prefix: String, allowList: [String]?) -> [String: Any] {
     var filteredPrefs: [String: Any] = [:]
+    var allowSet: Set<String>?;
+    if let allowList {
+      allowSet = Set(allowList)
+    }
     if let appDomain = Bundle.main.bundleIdentifier,
       let prefs = UserDefaults.standard.persistentDomain(forName: appDomain)
     {
-      for (key, value) in prefs where key.hasPrefix(prefix) {
+      for (key, value) in prefs where (key.hasPrefix(prefix) && (allowSet == nil || allowSet!.contains(key))) {
         filteredPrefs[key] = value
       }
     }
diff --git a/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/messages.g.swift b/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/messages.g.swift
index 9795c52..723fbe2 100644
--- a/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/messages.g.swift
+++ b/packages/shared_preferences/shared_preferences_foundation/darwin/Classes/messages.g.swift
@@ -1,7 +1,7 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-// Autogenerated from Pigeon (v9.2.4), do not edit directly.
+// Autogenerated from Pigeon (v9.2.5), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 
 import Foundation
@@ -42,8 +42,8 @@
   func setBool(key: String, value: Bool) throws
   func setDouble(key: String, value: Double) throws
   func setValue(key: String, value: Any) throws
-  func getAllWithPrefix(prefix: String) throws -> [String?: Any?]
-  func clearWithPrefix(prefix: String) throws
+  func getAll(prefix: String, allowList: [String]?) throws -> [String?: Any?]
+  func clear(prefix: String, allowList: [String]?) throws -> Bool
 }
 
 /// Generated setup class from Pigeon to handle messages through the `binaryMessenger`.
@@ -114,35 +114,37 @@
     } else {
       setValueChannel.setMessageHandler(nil)
     }
-    let getAllWithPrefixChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.UserDefaultsApi.getAllWithPrefix", binaryMessenger: binaryMessenger)
+    let getAllChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.UserDefaultsApi.getAll", binaryMessenger: binaryMessenger)
     if let api = api {
-      getAllWithPrefixChannel.setMessageHandler { message, reply in
+      getAllChannel.setMessageHandler { message, reply in
         let args = message as! [Any]
         let prefixArg = args[0] as! String
+        let allowListArg: [String]? = nilOrValue(args[1])
         do {
-          let result = try api.getAllWithPrefix(prefix: prefixArg)
+          let result = try api.getAll(prefix: prefixArg, allowList: allowListArg)
           reply(wrapResult(result))
         } catch {
           reply(wrapError(error))
         }
       }
     } else {
-      getAllWithPrefixChannel.setMessageHandler(nil)
+      getAllChannel.setMessageHandler(nil)
     }
-    let clearWithPrefixChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.UserDefaultsApi.clearWithPrefix", binaryMessenger: binaryMessenger)
+    let clearChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.UserDefaultsApi.clear", binaryMessenger: binaryMessenger)
     if let api = api {
-      clearWithPrefixChannel.setMessageHandler { message, reply in
+      clearChannel.setMessageHandler { message, reply in
         let args = message as! [Any]
         let prefixArg = args[0] as! String
+        let allowListArg: [String]? = nilOrValue(args[1])
         do {
-          try api.clearWithPrefix(prefix: prefixArg)
-          reply(wrapResult(nil))
+          let result = try api.clear(prefix: prefixArg, allowList: allowListArg)
+          reply(wrapResult(result))
         } catch {
           reply(wrapError(error))
         }
       }
     } else {
-      clearWithPrefixChannel.setMessageHandler(nil)
+      clearChannel.setMessageHandler(nil)
     }
   }
 }
diff --git a/packages/shared_preferences/shared_preferences_foundation/darwin/Tests/RunnerTests.swift b/packages/shared_preferences/shared_preferences_foundation/darwin/Tests/RunnerTests.swift
index c33b990..64dd646 100644
--- a/packages/shared_preferences/shared_preferences_foundation/darwin/Tests/RunnerTests.swift
+++ b/packages/shared_preferences/shared_preferences_foundation/darwin/Tests/RunnerTests.swift
@@ -25,7 +25,7 @@
       plugin.setValue(key: "\(aPrefix)aString", value: "hello world")
       plugin.setValue(key: "\(aPrefix)aStringList", value: ["hello", "world"])
 
-      let storedValues = plugin.getAllWithPrefix(prefix: aPrefix)
+      let storedValues = plugin.getAll(prefix: aPrefix, allowList: nil)
       XCTAssertEqual(storedValues["\(aPrefix)aBool"] as? Bool, true)
       XCTAssertEqual(storedValues["\(aPrefix)aDouble"] as! Double, 3.14, accuracy: 0.0001)
       XCTAssertEqual(storedValues["\(aPrefix)anInt"] as? Int, 42)
@@ -34,6 +34,25 @@
     }
   }
 
+  func testGetWithAllowList() throws {
+    for aPrefix in prefixes {
+      let plugin = SharedPreferencesPlugin()
+
+      plugin.setBool(key: "\(aPrefix)aBool", value: true)
+      plugin.setDouble(key: "\(aPrefix)aDouble", value: 3.14)
+      plugin.setValue(key: "\(aPrefix)anInt", value: 42)
+      plugin.setValue(key: "\(aPrefix)aString", value: "hello world")
+      plugin.setValue(key: "\(aPrefix)aStringList", value: ["hello", "world"])
+
+      let storedValues = plugin.getAll(prefix: aPrefix, allowList: ["\(aPrefix)aBool"])
+      XCTAssertEqual(storedValues["\(aPrefix)aBool"] as? Bool, true)
+      XCTAssertNil(storedValues["\(aPrefix)aDouble"] ?? nil)
+      XCTAssertNil(storedValues["\(aPrefix)anInt"] ?? nil)
+      XCTAssertNil(storedValues["\(aPrefix)aString"] ?? nil)
+      XCTAssertNil(storedValues["\(aPrefix)aStringList"] ?? nil)
+    }
+  }
+
   func testRemove() throws {
     for aPrefix in prefixes {
       let plugin = SharedPreferencesPlugin()
@@ -41,33 +60,50 @@
       plugin.setValue(key: testKey, value: 42)
 
       // Make sure there is something to remove, so the test can't pass due to a set failure.
-      let preRemovalValues = plugin.getAllWithPrefix(prefix: aPrefix)
+      let preRemovalValues = plugin.getAll(prefix: aPrefix, allowList: nil)
       XCTAssertEqual(preRemovalValues[testKey] as? Int, 42)
 
       // Then verify that removing it works.
       plugin.remove(key: testKey)
 
-      let finalValues = plugin.getAllWithPrefix(prefix: aPrefix)
+      let finalValues = plugin.getAll(prefix: aPrefix, allowList: nil)
       XCTAssertNil(finalValues[testKey] as Any?)
     }
   }
+    
+    func testClearWithNoAllowlist() throws {
+      for aPrefix in prefixes {
+        let plugin = SharedPreferencesPlugin()
+        let testKey = "\(aPrefix)foo"
+        plugin.setValue(key: testKey, value: 42)
 
-  func testClear() throws {
-    for aPrefix in prefixes {
-      let plugin = SharedPreferencesPlugin()
-      let testKey = "\(aPrefix)foo"
-      plugin.setValue(key: testKey, value: 42)
+        // Make sure there is something to clear, so the test can't pass due to a set failure.
+        let preRemovalValues = plugin.getAll(prefix: aPrefix, allowList: nil)
+        XCTAssertEqual(preRemovalValues[testKey] as? Int, 42)
 
-      // Make sure there is something to clear, so the test can't pass due to a set failure.
-      let preRemovalValues = plugin.getAllWithPrefix(prefix: aPrefix)
-      XCTAssertEqual(preRemovalValues[testKey] as? Int, 42)
+        // Then verify that clearing works.
+        plugin.clear(prefix: aPrefix, allowList: nil)
 
-      // Then verify that clearing works.
-      plugin.clearWithPrefix(prefix: aPrefix)
-
-      let finalValues = plugin.getAllWithPrefix(prefix: aPrefix)
-      XCTAssertNil(finalValues[testKey] as Any?)
+        let finalValues = plugin.getAll(prefix: aPrefix, allowList: nil)
+        XCTAssertNil(finalValues[testKey] as Any?)
+      }
     }
-  }
+    
+    func testClearWithAllowlist() throws {
+      for aPrefix in prefixes {
+        let plugin = SharedPreferencesPlugin()
+        let testKey = "\(aPrefix)foo"
+        plugin.setValue(key: testKey, value: 42)
+
+        // Make sure there is something to clear, so the test can't pass due to a set failure.
+        let preRemovalValues = plugin.getAll(prefix: aPrefix, allowList: nil)
+        XCTAssertEqual(preRemovalValues[testKey] as? Int, 42)
+
+        plugin.clear(prefix: aPrefix, allowList: ["\(aPrefix)notfoo"])
+
+        let finalValues = plugin.getAll(prefix: aPrefix, allowList: nil)
+          XCTAssertEqual(finalValues[testKey] as? Int, 42)
+      }
+    }
   
 }
diff --git a/packages/shared_preferences/shared_preferences_foundation/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_foundation/example/integration_test/shared_preferences_test.dart
index d19feda..49892ec 100644
--- a/packages/shared_preferences/shared_preferences_foundation/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_foundation/example/integration_test/shared_preferences_test.dart
@@ -5,6 +5,7 @@
 import 'package:flutter_test/flutter_test.dart';
 import 'package:integration_test/integration_test.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
@@ -46,175 +47,375 @@
       preferences = SharedPreferencesStorePlatform.instance;
     });
 
-    tearDown(() {
-      // ignore: deprecated_member_use
-      preferences.clearWithPrefix('');
+    tearDown(() async {
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
     });
 
-    testWidgets('reading', (WidgetTester _) async {
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
-      expect(values['String'], isNull);
-      expect(values['Bool'], isNull);
-      expect(values['Int'], isNull);
-      expect(values['Double'], isNull);
-      expect(values['StringList'], isNull);
+    group('withPrefix', () {
+      testWidgets('reading', (WidgetTester _) async {
+        final Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], isNull);
+        expect(values['Bool'], isNull);
+        expect(values['Int'], isNull);
+        expect(values['Double'], isNull);
+        expect(values['StringList'], isNull);
+      });
+
+      testWidgets('getAllWithPrefix', (WidgetTester _) async {
+        await Future.wait(<Future<bool>>[
+          preferences.setValue(
+              'String', 'prefix.String', allTestValues['prefix.String']!),
+          preferences.setValue(
+              'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
+          preferences.setValue(
+              'Int', 'prefix.Int', allTestValues['prefix.Int']!),
+          preferences.setValue(
+              'Double', 'prefix.Double', allTestValues['prefix.Double']!),
+          preferences.setValue('StringList', 'prefix.StringList',
+              allTestValues['prefix.StringList']!),
+          preferences.setValue(
+              'String', 'flutter.String', allTestValues['flutter.String']!),
+          preferences.setValue(
+              'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
+          preferences.setValue(
+              'Int', 'flutter.Int', allTestValues['flutter.Int']!),
+          preferences.setValue(
+              'Double', 'flutter.Double', allTestValues['flutter.Double']!),
+          preferences.setValue('StringList', 'flutter.StringList',
+              allTestValues['flutter.StringList']!)
+        ]);
+        final Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('prefix.');
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+      });
+
+      testWidgets('clearWithPrefix', (WidgetTester _) async {
+        await Future.wait(<Future<bool>>[
+          preferences.setValue(
+              'String', 'prefix.String', allTestValues['prefix.String']!),
+          preferences.setValue(
+              'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
+          preferences.setValue(
+              'Int', 'prefix.Int', allTestValues['prefix.Int']!),
+          preferences.setValue(
+              'Double', 'prefix.Double', allTestValues['prefix.Double']!),
+          preferences.setValue('StringList', 'prefix.StringList',
+              allTestValues['prefix.StringList']!),
+          preferences.setValue(
+              'String', 'flutter.String', allTestValues['flutter.String']!),
+          preferences.setValue(
+              'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
+          preferences.setValue(
+              'Int', 'flutter.Int', allTestValues['flutter.Int']!),
+          preferences.setValue(
+              'Double', 'flutter.Double', allTestValues['flutter.Double']!),
+          preferences.setValue('StringList', 'flutter.StringList',
+              allTestValues['flutter.StringList']!)
+        ]);
+        // ignore: deprecated_member_use
+        await preferences.clearWithPrefix('prefix.');
+        Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('prefix.');
+        expect(values['prefix.String'], null);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+        // ignore: deprecated_member_use
+        values = await preferences.getAllWithPrefix('flutter.');
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+        await Future.wait(<Future<bool>>[
+          preferences.setValue('String', 'String', allTestValues['String']!),
+          preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
+          preferences.setValue('Int', 'Int', allTestValues['Int']!),
+          preferences.setValue('Double', 'Double', allTestValues['Double']!),
+          preferences.setValue(
+              'StringList', 'StringList', allTestValues['StringList']!),
+          preferences.setValue(
+              'String', 'flutter.String', allTestValues['flutter.String']!),
+          preferences.setValue(
+              'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
+          preferences.setValue(
+              'Int', 'flutter.Int', allTestValues['flutter.Int']!),
+          preferences.setValue(
+              'Double', 'flutter.Double', allTestValues['flutter.Double']!),
+          preferences.setValue('StringList', 'flutter.StringList',
+              allTestValues['flutter.StringList']!)
+        ]);
+        final Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], allTestValues['String']);
+        expect(values['Bool'], allTestValues['Bool']);
+        expect(values['Int'], allTestValues['Int']);
+        expect(values['Double'], allTestValues['Double']);
+        expect(values['StringList'], allTestValues['StringList']);
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithNoPrefix', (WidgetTester _) async {
+        await Future.wait(<Future<bool>>[
+          preferences.setValue('String', 'String', allTestValues['String']!),
+          preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
+          preferences.setValue('Int', 'Int', allTestValues['Int']!),
+          preferences.setValue('Double', 'Double', allTestValues['Double']!),
+          preferences.setValue(
+              'StringList', 'StringList', allTestValues['StringList']!),
+          preferences.setValue(
+              'String', 'flutter.String', allTestValues['flutter.String']!),
+          preferences.setValue(
+              'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
+          preferences.setValue(
+              'Int', 'flutter.Int', allTestValues['flutter.Int']!),
+          preferences.setValue(
+              'Double', 'flutter.Double', allTestValues['flutter.Double']!),
+          preferences.setValue('StringList', 'flutter.StringList',
+              allTestValues['flutter.StringList']!)
+        ]);
+        // ignore: deprecated_member_use
+        await preferences.clearWithPrefix('');
+        final Map<String, Object> values =
+            // ignore: deprecated_member_use
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], null);
+        expect(values['Bool'], null);
+        expect(values['Int'], null);
+        expect(values['Double'], null);
+        expect(values['StringList'], null);
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
     });
 
-    testWidgets('getAllWithPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'prefix.String', allTestValues['prefix.String']!),
-        preferences.setValue(
-            'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
-        preferences.setValue('Int', 'prefix.Int', allTestValues['prefix.Int']!),
-        preferences.setValue(
-            'Double', 'prefix.Double', allTestValues['prefix.Double']!),
-        preferences.setValue('StringList', 'prefix.StringList',
-            allTestValues['prefix.StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      final Map<String, Object> values =
-          // ignore: deprecated_member_use
-          await preferences.getAllWithPrefix('prefix.');
-      expect(values['prefix.String'], allTestValues['prefix.String']);
-      expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
-      expect(values['prefix.Int'], allTestValues['prefix.Int']);
-      expect(values['prefix.Double'], allTestValues['prefix.Double']);
-      expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
-    });
+    group('withParameters', () {
+      testWidgets('reading', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values['String'], isNull);
+        expect(values['Bool'], isNull);
+        expect(values['Int'], isNull);
+        expect(values['Double'], isNull);
+        expect(values['StringList'], isNull);
+      });
 
-    testWidgets('clearWithPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'prefix.String', allTestValues['prefix.String']!),
-        preferences.setValue(
-            'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
-        preferences.setValue('Int', 'prefix.Int', allTestValues['prefix.Int']!),
-        preferences.setValue(
-            'Double', 'prefix.Double', allTestValues['prefix.Double']!),
-        preferences.setValue('StringList', 'prefix.StringList',
-            allTestValues['prefix.StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      // ignore: deprecated_member_use
-      await preferences.clearWithPrefix('prefix.');
-      Map<String, Object> values =
-          // ignore: deprecated_member_use
-          await preferences.getAllWithPrefix('prefix.');
-      expect(values['prefix.String'], null);
-      expect(values['prefix.Bool'], null);
-      expect(values['prefix.Int'], null);
-      expect(values['prefix.Double'], null);
-      expect(values['prefix.StringList'], null);
-      // ignore: deprecated_member_use
-      values = await preferences.getAllWithPrefix('flutter.');
-      expect(values['flutter.String'], allTestValues['flutter.String']);
-      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
-      expect(values['flutter.Int'], allTestValues['flutter.Int']);
-      expect(values['flutter.Double'], allTestValues['flutter.Double']);
-      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
-    });
+      Future<void> addData() async {
+        await preferences.setValue(
+            'String', 'String', allTestValues['String']!);
+        await preferences.setValue('Bool', 'Bool', allTestValues['Bool']!);
+        await preferences.setValue('Int', 'Int', allTestValues['Int']!);
+        await preferences.setValue(
+            'Double', 'Double', allTestValues['Double']!);
+        await preferences.setValue(
+            'StringList', 'StringList', allTestValues['StringList']!);
+        await preferences.setValue(
+            'String', 'prefix.String', allTestValues['prefix.String']!);
+        await preferences.setValue(
+            'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!);
+        await preferences.setValue(
+            'Int', 'prefix.Int', allTestValues['prefix.Int']!);
+        await preferences.setValue(
+            'Double', 'prefix.Double', allTestValues['prefix.Double']!);
+        await preferences.setValue('StringList', 'prefix.StringList',
+            allTestValues['prefix.StringList']!);
+        await preferences.setValue(
+            'String', 'flutter.String', allTestValues['flutter.String']!);
+        await preferences.setValue(
+            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
+        await preferences.setValue(
+            'Int', 'flutter.Int', allTestValues['flutter.Int']!);
+        await preferences.setValue(
+            'Double', 'flutter.Double', allTestValues['flutter.Double']!);
+        await preferences.setValue('StringList', 'flutter.StringList',
+            allTestValues['flutter.StringList']!);
+      }
 
-    testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue('String', 'String', allTestValues['String']!),
-        preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
-        preferences.setValue('Int', 'Int', allTestValues['Int']!),
-        preferences.setValue('Double', 'Double', allTestValues['Double']!),
-        preferences.setValue(
-            'StringList', 'StringList', allTestValues['StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
-      expect(values['String'], allTestValues['String']);
-      expect(values['Bool'], allTestValues['Bool']);
-      expect(values['Int'], allTestValues['Int']);
-      expect(values['Double'], allTestValues['Double']);
-      expect(values['StringList'], allTestValues['StringList']);
-      expect(values['flutter.String'], allTestValues['flutter.String']);
-      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
-      expect(values['flutter.Int'], allTestValues['flutter.Int']);
-      expect(values['flutter.Double'], allTestValues['flutter.Double']);
-      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
-    });
+      testWidgets('get all with prefix', (WidgetTester _) async {
+        await addData();
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+      });
 
-    testWidgets('clearWithNoPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue('String', 'String', allTestValues['String']!),
-        preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
-        preferences.setValue('Int', 'Int', allTestValues['Int']!),
-        preferences.setValue('Double', 'Double', allTestValues['Double']!),
-        preferences.setValue(
-            'StringList', 'StringList', allTestValues['StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      // ignore: deprecated_member_use
-      await preferences.clearWithPrefix('');
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
-      expect(values['String'], null);
-      expect(values['Bool'], null);
-      expect(values['Int'], null);
-      expect(values['Double'], null);
-      expect(values['StringList'], null);
-      expect(values['flutter.String'], null);
-      expect(values['flutter.Bool'], null);
-      expect(values['flutter.Int'], null);
-      expect(values['flutter.Double'], null);
-      expect(values['flutter.StringList'], null);
+      testWidgets('get all with allow list', (WidgetTester _) async {
+        await addData();
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(
+              prefix: 'prefix.',
+              allowList: <String>{'prefix.String'},
+            ),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+      });
+
+      testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+        await addData();
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values['String'], allTestValues['String']);
+        expect(values['Bool'], allTestValues['Bool']);
+        expect(values['Int'], allTestValues['Int']);
+        expect(values['Double'], allTestValues['Double']);
+        expect(values['StringList'], allTestValues['StringList']);
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithParameters', (WidgetTester _) async {
+        await addData();
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        Map<String, Object> values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], null);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'flutter.'),
+          ),
+        );
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithParameters with allow list',
+          (WidgetTester _) async {
+        await addData();
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(
+              prefix: 'prefix.',
+              allowList: <String>{'prefix.StringList'},
+            ),
+          ),
+        );
+        Map<String, Object> values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'flutter.'),
+          ),
+        );
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithNoPrefix', (WidgetTester _) async {
+        await addData();
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values['String'], null);
+        expect(values['Bool'], null);
+        expect(values['Int'], null);
+        expect(values['Double'], null);
+        expect(values['StringList'], null);
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
     });
 
     testWidgets('getAll', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
+      await preferences.setValue(
+          'String', 'flutter.String', allTestValues['flutter.String']!);
+      await preferences.setValue(
+          'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
+      await preferences.setValue(
+          'Int', 'flutter.Int', allTestValues['flutter.Int']!);
+      await preferences.setValue(
+          'Double', 'flutter.Double', allTestValues['flutter.Double']!);
+      await preferences.setValue('StringList', 'flutter.StringList',
+          allTestValues['flutter.StringList']!);
       final Map<String, Object> values = await preferences.getAll();
       expect(values['flutter.String'], allTestValues['flutter.String']);
       expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
@@ -234,8 +435,11 @@
       await preferences.setValue(
           'StringList', key, allTestValues['flutter.StringList']!);
       await preferences.remove(key);
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values[key], isNull);
     });
 
@@ -269,8 +473,11 @@
       // All writes should succeed.
       expect(result.where((bool element) => !element), isEmpty);
       // The last write should win.
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values['Int'], writeCount);
     });
   });
diff --git a/packages/shared_preferences/shared_preferences_foundation/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_foundation/example/pubspec.yaml
index 685231d..92c460b 100644
--- a/packages/shared_preferences/shared_preferences_foundation/example/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_foundation/example/pubspec.yaml
@@ -16,7 +16,7 @@
     # The example app is bundled with the plugin so we use a path dependency on
     # the parent directory to use the current plugin's version.
     path: ../
-  shared_preferences_platform_interface: ^2.0.0
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_driver:
diff --git a/packages/shared_preferences/shared_preferences_foundation/lib/messages.g.dart b/packages/shared_preferences/shared_preferences_foundation/lib/messages.g.dart
index 9f36470..9ef9124 100644
--- a/packages/shared_preferences/shared_preferences_foundation/lib/messages.g.dart
+++ b/packages/shared_preferences/shared_preferences_foundation/lib/messages.g.dart
@@ -1,7 +1,7 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-// Autogenerated from Pigeon (v9.2.4), do not edit directly.
+// Autogenerated from Pigeon (v9.2.5), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import
 
@@ -109,12 +109,13 @@
     }
   }
 
-  Future<Map<String?, Object?>> getAllWithPrefix(String arg_prefix) async {
+  Future<Map<String?, Object?>> getAll(
+      String arg_prefix, List<String?>? arg_allowList) async {
     final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.UserDefaultsApi.getAllWithPrefix', codec,
+        'dev.flutter.pigeon.UserDefaultsApi.getAll', codec,
         binaryMessenger: _binaryMessenger);
-    final List<Object?>? replyList =
-        await channel.send(<Object?>[arg_prefix]) as List<Object?>?;
+    final List<Object?>? replyList = await channel
+        .send(<Object?>[arg_prefix, arg_allowList]) as List<Object?>?;
     if (replyList == null) {
       throw PlatformException(
         code: 'channel-error',
@@ -136,12 +137,12 @@
     }
   }
 
-  Future<void> clearWithPrefix(String arg_prefix) async {
+  Future<bool> clear(String arg_prefix, List<String?>? arg_allowList) async {
     final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-        'dev.flutter.pigeon.UserDefaultsApi.clearWithPrefix', codec,
+        'dev.flutter.pigeon.UserDefaultsApi.clear', codec,
         binaryMessenger: _binaryMessenger);
-    final List<Object?>? replyList =
-        await channel.send(<Object?>[arg_prefix]) as List<Object?>?;
+    final List<Object?>? replyList = await channel
+        .send(<Object?>[arg_prefix, arg_allowList]) as List<Object?>?;
     if (replyList == null) {
       throw PlatformException(
         code: 'channel-error',
@@ -153,8 +154,13 @@
         message: replyList[1] as String?,
         details: replyList[2],
       );
+    } else if (replyList[0] == null) {
+      throw PlatformException(
+        code: 'null-error',
+        message: 'Host platform returned null value for non-null return value.',
+      );
     } else {
-      return;
+      return (replyList[0] as bool?)!;
     }
   }
 }
diff --git a/packages/shared_preferences/shared_preferences_foundation/lib/shared_preferences_foundation.dart b/packages/shared_preferences/shared_preferences_foundation/lib/shared_preferences_foundation.dart
index f535ab9..92699b7 100644
--- a/packages/shared_preferences/shared_preferences_foundation/lib/shared_preferences_foundation.dart
+++ b/packages/shared_preferences/shared_preferences_foundation/lib/shared_preferences_foundation.dart
@@ -4,6 +4,7 @@
 
 import 'package:flutter/services.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 import 'messages.g.dart';
 
 typedef _Setter = Future<void> Function(String key, Object value);
@@ -12,7 +13,7 @@
 class SharedPreferencesFoundation extends SharedPreferencesStorePlatform {
   final UserDefaultsApi _api = UserDefaultsApi();
 
-  static const String _defautPrefix = 'flutter.';
+  static const String _defaultPrefix = 'flutter.';
 
   late final Map<String, _Setter> _setters = <String, _Setter>{
     'Bool': (String key, Object value) {
@@ -40,24 +41,50 @@
 
   @override
   Future<bool> clear() async {
-    return clearWithPrefix(_defautPrefix);
+    return clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<bool> clearWithPrefix(String prefix) async {
-    await _api.clearWithPrefix(prefix);
-    return true;
+    return clearWithParameters(
+        ClearParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<bool> clearWithParameters(ClearParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
+    return _api.clear(
+      filter.prefix,
+      filter.allowList?.toList(),
+    );
   }
 
   @override
   Future<Map<String, Object>> getAll() async {
-    return getAllWithPrefix(_defautPrefix);
+    return getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<Map<String, Object>> getAllWithPrefix(String prefix) async {
-    final Map<String?, Object?> result = await _api.getAllWithPrefix(prefix);
-    return result.cast<String, Object>();
+    return getAllWithParameters(
+        GetAllParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<Map<String, Object>> getAllWithParameters(
+      GetAllParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
+    final Map<String?, Object?> data =
+        await _api.getAll(filter.prefix, filter.allowList?.toList());
+    return data.cast<String, Object>();
   }
 
   @override
diff --git a/packages/shared_preferences/shared_preferences_foundation/pigeons/messages.dart b/packages/shared_preferences/shared_preferences_foundation/pigeons/messages.dart
index e651546..46deeef 100644
--- a/packages/shared_preferences/shared_preferences_foundation/pigeons/messages.dart
+++ b/packages/shared_preferences/shared_preferences_foundation/pigeons/messages.dart
@@ -20,6 +20,6 @@
   void setValue(String key, Object value);
   // TODO(stuartmorgan): Make these non-nullable once
   // https://github.com/flutter/flutter/issues/97848 is fixed.
-  Map<String?, Object?> getAllWithPrefix(String prefix);
-  void clearWithPrefix(String prefix);
+  Map<String?, Object?> getAll(String prefix, List<String>? allowList);
+  bool clear(String prefix, List<String>? allowList);
 }
diff --git a/packages/shared_preferences/shared_preferences_foundation/pubspec.yaml b/packages/shared_preferences/shared_preferences_foundation/pubspec.yaml
index d2ee5cb..a6d714d 100644
--- a/packages/shared_preferences/shared_preferences_foundation/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_foundation/pubspec.yaml
@@ -2,7 +2,7 @@
 description: iOS and macOS implementation of the shared_preferences plugin.
 repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_foundation
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.2.2
+version: 2.3.0
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -24,7 +24,7 @@
 dependencies:
   flutter:
     sdk: flutter
-  shared_preferences_platform_interface: ^2.2.0
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/shared_preferences/shared_preferences_foundation/test/shared_preferences_foundation_test.dart b/packages/shared_preferences/shared_preferences_foundation/test/shared_preferences_foundation_test.dart
index 5859aad..496cdd9 100644
--- a/packages/shared_preferences/shared_preferences_foundation/test/shared_preferences_foundation_test.dart
+++ b/packages/shared_preferences/shared_preferences_foundation/test/shared_preferences_foundation_test.dart
@@ -6,6 +6,7 @@
 import 'package:flutter_test/flutter_test.dart';
 import 'package:shared_preferences_foundation/shared_preferences_foundation.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 import 'test_api.g.dart';
 
@@ -13,10 +14,19 @@
   final Map<String, Object> items = <String, Object>{};
 
   @override
-  Map<String?, Object?> getAllWithPrefix(String prefix) {
+  Map<String?, Object?> getAll(
+    String prefix,
+    List<String?>? allowList,
+  ) {
+    Set<String?>? allowSet;
+    if (allowList != null) {
+      allowSet = Set<String>.from(allowList);
+    }
     return <String?, Object?>{
       for (final String key in items.keys)
-        if (key.startsWith(prefix)) key: items[key]
+        if (key.startsWith(prefix) &&
+            (allowSet == null || allowSet.contains(key)))
+          key: items[key]
     };
   }
 
@@ -41,12 +51,14 @@
   }
 
   @override
-  void clearWithPrefix(String prefix) {
+  bool clear(String prefix, List<String?>? allowList) {
     items.keys.toList().forEach((String key) {
-      if (key.startsWith(prefix)) {
+      if (key.startsWith(prefix) &&
+          (allowList == null || allowList.contains(key))) {
         items.remove(key);
       }
     });
+    return true;
   }
 }
 
@@ -124,6 +136,63 @@
     expect(all.length, 0);
   });
 
+  test('clearWithParameters', () async {
+    final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+
+    Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 5);
+    await plugin.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    all = await plugin.getAll();
+    expect(all.length, 5);
+    all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 0);
+  });
+
+  test('clearWithParameters with allow list', () async {
+    final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+
+    Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 5);
+    await plugin.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.String'},
+        ),
+      ),
+    );
+    all = await plugin.getAll();
+    expect(all.length, 5);
+    all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 4);
+  });
+
   test('getAll', () async {
     final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
     for (final String key in flutterTestValues.keys) {
@@ -144,6 +213,37 @@
     expect(all, prefixTestValues);
   });
 
+  test('getAllWithParameters', () async {
+    final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+    final Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(all.length, 5);
+    expect(all, prefixTestValues);
+  });
+
+  test('getAllWithParameters with allow list', () async {
+    final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+    final Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.Bool'},
+        ),
+      ),
+    );
+    expect(all.length, 1);
+    expect(all['prefix.Bool'], prefixTestValues['prefix.Bool']);
+  });
+
   test('setValue', () async {
     final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
     expect(await plugin.setValue('Bool', 'flutter.Bool', true), isTrue);
@@ -190,4 +290,43 @@
     all = await plugin.getAllWithPrefix('');
     expect(all.length, 0);
   });
+
+  test('getAllWithNoPrefix with param', () async {
+    final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+    final Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(all.length, 15);
+    expect(all, allTestValues);
+  });
+
+  test('clearWithNoPrefix with param', () async {
+    final SharedPreferencesFoundation plugin = SharedPreferencesFoundation();
+    for (final String key in allTestValues.keys) {
+      api.items[key] = allTestValues[key]!;
+    }
+
+    Map<String?, Object?> all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(all.length, 15);
+    await plugin.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    all = await plugin.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(all.length, 0);
+  });
 }
diff --git a/packages/shared_preferences/shared_preferences_foundation/test/test_api.g.dart b/packages/shared_preferences/shared_preferences_foundation/test/test_api.g.dart
index c581d51..6dd35a9 100644
--- a/packages/shared_preferences/shared_preferences_foundation/test/test_api.g.dart
+++ b/packages/shared_preferences/shared_preferences_foundation/test/test_api.g.dart
@@ -1,7 +1,7 @@
 // Copyright 2013 The Flutter Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-// Autogenerated from Pigeon (v9.2.4), do not edit directly.
+// Autogenerated from Pigeon (v9.2.5), do not edit directly.
 // See also: https://pub.dev/packages/pigeon
 // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, unnecessary_import
 // ignore_for_file: avoid_relative_lib_imports
@@ -26,9 +26,9 @@
 
   void setValue(String key, Object value);
 
-  Map<String?, Object?> getAllWithPrefix(String prefix);
+  Map<String?, Object?> getAll(String prefix, List<String?>? allowList);
 
-  void clearWithPrefix(String prefix);
+  bool clear(String prefix, List<String?>? allowList);
 
   static void setup(TestUserDefaultsApi? api,
       {BinaryMessenger? binaryMessenger}) {
@@ -131,7 +131,7 @@
     }
     {
       final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.UserDefaultsApi.getAllWithPrefix', codec,
+          'dev.flutter.pigeon.UserDefaultsApi.getAll', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
         _testBinaryMessengerBinding!.defaultBinaryMessenger
@@ -141,20 +141,22 @@
             .setMockDecodedMessageHandler<Object?>(channel,
                 (Object? message) async {
           assert(message != null,
-              'Argument for dev.flutter.pigeon.UserDefaultsApi.getAllWithPrefix was null.');
+              'Argument for dev.flutter.pigeon.UserDefaultsApi.getAll was null.');
           final List<Object?> args = (message as List<Object?>?)!;
           final String? arg_prefix = (args[0] as String?);
           assert(arg_prefix != null,
-              'Argument for dev.flutter.pigeon.UserDefaultsApi.getAllWithPrefix was null, expected non-null String.');
+              'Argument for dev.flutter.pigeon.UserDefaultsApi.getAll was null, expected non-null String.');
+          final List<String?>? arg_allowList =
+              (args[1] as List<Object?>?)?.cast<String?>();
           final Map<String?, Object?> output =
-              api.getAllWithPrefix(arg_prefix!);
+              api.getAll(arg_prefix!, arg_allowList);
           return <Object?>[output];
         });
       }
     }
     {
       final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
-          'dev.flutter.pigeon.UserDefaultsApi.clearWithPrefix', codec,
+          'dev.flutter.pigeon.UserDefaultsApi.clear', codec,
           binaryMessenger: binaryMessenger);
       if (api == null) {
         _testBinaryMessengerBinding!.defaultBinaryMessenger
@@ -164,13 +166,15 @@
             .setMockDecodedMessageHandler<Object?>(channel,
                 (Object? message) async {
           assert(message != null,
-              'Argument for dev.flutter.pigeon.UserDefaultsApi.clearWithPrefix was null.');
+              'Argument for dev.flutter.pigeon.UserDefaultsApi.clear was null.');
           final List<Object?> args = (message as List<Object?>?)!;
           final String? arg_prefix = (args[0] as String?);
           assert(arg_prefix != null,
-              'Argument for dev.flutter.pigeon.UserDefaultsApi.clearWithPrefix was null, expected non-null String.');
-          api.clearWithPrefix(arg_prefix!);
-          return <Object?>[];
+              'Argument for dev.flutter.pigeon.UserDefaultsApi.clear was null, expected non-null String.');
+          final List<String?>? arg_allowList =
+              (args[1] as List<Object?>?)?.cast<String?>();
+          final bool output = api.clear(arg_prefix!, arg_allowList);
+          return <Object?>[output];
         });
       }
     }
diff --git a/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md b/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md
index be38e84..86ba0e9 100644
--- a/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 2.3.0
 
+* Adds `clearWithParameters` and `getAllWithParameters` methods.
 * Updates minimum supported SDK version to Flutter 3.3/Dart 2.18.
 
 ## 2.2.0
diff --git a/packages/shared_preferences/shared_preferences_linux/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_linux/example/integration_test/shared_preferences_test.dart
index 8939d0a..5f06c87 100644
--- a/packages/shared_preferences/shared_preferences_linux/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_linux/example/integration_test/shared_preferences_test.dart
@@ -5,101 +5,335 @@
 import 'package:flutter_test/flutter_test.dart';
 import 'package:integration_test/integration_test.dart';
 import 'package:shared_preferences_linux/shared_preferences_linux.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
 
   group('SharedPreferencesLinux', () {
-    const Map<String, Object> kTestValues = <String, Object>{
-      'flutter.String': 'hello world',
-      'flutter.bool': true,
-      'flutter.int': 42,
-      'flutter.double': 3.14159,
-      'flutter.List': <String>['foo', 'bar'],
-    };
-
-    const Map<String, Object> kTestValues2 = <String, Object>{
-      'flutter.String': 'goodbye world',
-      'flutter.bool': false,
-      'flutter.int': 1337,
-      'flutter.double': 2.71828,
-      'flutter.List': <String>['baz', 'quox'],
-    };
-
     late SharedPreferencesLinux preferences;
 
+    const Map<String, Object> flutterTestValues = <String, Object>{
+      'flutter.String': 'hello world',
+      'flutter.Bool': true,
+      'flutter.Int': 42,
+      'flutter.Double': 3.14159,
+      'flutter.StringList': <String>['foo', 'bar'],
+    };
+
+    const Map<String, Object> prefixTestValues = <String, Object>{
+      'prefix.String': 'hello world',
+      'prefix.Bool': true,
+      'prefix.Int': 42,
+      'prefix.Double': 3.14159,
+      'prefix.StringList': <String>['foo', 'bar'],
+    };
+
+    const Map<String, Object> nonPrefixTestValues = <String, Object>{
+      'String': 'hello world',
+      'Bool': true,
+      'Int': 42,
+      'Double': 3.14159,
+      'StringList': <String>['foo', 'bar'],
+    };
+
+    final Map<String, Object> allTestValues = <String, Object>{};
+
+    allTestValues.addAll(flutterTestValues);
+    allTestValues.addAll(prefixTestValues);
+    allTestValues.addAll(nonPrefixTestValues);
+
+    Future<void> addData() async {
+      await preferences.setValue('String', 'String', allTestValues['String']!);
+      await preferences.setValue('Bool', 'Bool', allTestValues['Bool']!);
+      await preferences.setValue('Int', 'Int', allTestValues['Int']!);
+      await preferences.setValue('Double', 'Double', allTestValues['Double']!);
+      await preferences.setValue(
+          'StringList', 'StringList', allTestValues['StringList']!);
+      await preferences.setValue(
+          'String', 'prefix.String', allTestValues['prefix.String']!);
+      await preferences.setValue(
+          'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!);
+      await preferences.setValue(
+          'Int', 'prefix.Int', allTestValues['prefix.Int']!);
+      await preferences.setValue(
+          'Double', 'prefix.Double', allTestValues['prefix.Double']!);
+      await preferences.setValue('StringList', 'prefix.StringList',
+          allTestValues['prefix.StringList']!);
+      await preferences.setValue(
+          'String', 'flutter.String', allTestValues['flutter.String']!);
+      await preferences.setValue(
+          'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
+      await preferences.setValue(
+          'Int', 'flutter.Int', allTestValues['flutter.Int']!);
+      await preferences.setValue(
+          'Double', 'flutter.Double', allTestValues['flutter.Double']!);
+      await preferences.setValue('StringList', 'flutter.StringList',
+          allTestValues['flutter.StringList']!);
+    }
+
     setUp(() async {
       preferences = SharedPreferencesLinux();
+      await addData();
     });
 
-    tearDown(() {
-      preferences.clear();
+    tearDown(() async {
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
     });
 
-    testWidgets('reading', (WidgetTester _) async {
-      final Map<String, Object> all = await preferences.getAll();
-      expect(all['flutter.String'], isNull);
-      expect(all['flutter.bool'], isNull);
-      expect(all['flutter.int'], isNull);
-      expect(all['flutter.double'], isNull);
-      expect(all['flutter.List'], isNull);
+    testWidgets('getAll', (WidgetTester _) async {
+      final Map<String, Object> values = await preferences.getAll();
+      expect(values['flutter.String'], allTestValues['flutter.String']);
+      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+      expect(values['flutter.Int'], allTestValues['flutter.Int']);
+      expect(values['flutter.Double'], allTestValues['flutter.Double']);
+      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
     });
 
-    testWidgets('writing', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'flutter.String', kTestValues2['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.bool', kTestValues2['flutter.bool']!),
-        preferences.setValue(
-            'Int', 'flutter.int', kTestValues2['flutter.int']!),
-        preferences.setValue(
-            'Double', 'flutter.double', kTestValues2['flutter.double']!),
-        preferences.setValue(
-            'StringList', 'flutter.List', kTestValues2['flutter.List']!)
-      ]);
-      final Map<String, Object> all = await preferences.getAll();
-      expect(all['flutter.String'], kTestValues2['flutter.String']);
-      expect(all['flutter.bool'], kTestValues2['flutter.bool']);
-      expect(all['flutter.int'], kTestValues2['flutter.int']);
-      expect(all['flutter.double'], kTestValues2['flutter.double']);
-      expect(all['flutter.List'], kTestValues2['flutter.List']);
+    group('withPrefix', () {
+      testWidgets('remove', (WidgetTester _) async {
+        const String key = 'flutter.String';
+        await preferences.remove(key);
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('');
+        expect(values[key], isNull);
+      });
+
+      testWidgets('clear', (WidgetTester _) async {
+        await preferences.clear();
+        final Map<String, Object> values = await preferences.getAll();
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
+
+      testWidgets('get all with prefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('prefix.');
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+      });
+
+      testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], allTestValues['String']);
+        expect(values['Bool'], allTestValues['Bool']);
+        expect(values['Int'], allTestValues['Int']);
+        expect(values['Double'], allTestValues['Double']);
+        expect(values['StringList'], allTestValues['StringList']);
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithPrefix', (WidgetTester _) async {
+        await preferences.clearWithPrefix('prefix.');
+        Map<String, Object> values =
+            await preferences.getAllWithPrefix('prefix.');
+        expect(values['prefix.String'], null);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithPrefix('flutter.');
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithNoPrefix', (WidgetTester _) async {
+        await preferences.clearWithPrefix('');
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], null);
+        expect(values['Bool'], null);
+        expect(values['Int'], null);
+        expect(values['Double'], null);
+        expect(values['StringList'], null);
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
     });
 
-    testWidgets('removing', (WidgetTester _) async {
-      const String key = 'flutter.testKey';
+    group('withParameters', () {
+      testWidgets('remove', (WidgetTester _) async {
+        const String key = 'flutter.String';
+        await preferences.remove(key);
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values[key], isNull);
+      });
 
-      await Future.wait(<Future<bool>>[
-        preferences.setValue('String', key, kTestValues['flutter.String']!),
-        preferences.setValue('Bool', key, kTestValues['flutter.bool']!),
-        preferences.setValue('Int', key, kTestValues['flutter.int']!),
-        preferences.setValue('Double', key, kTestValues['flutter.double']!),
-        preferences.setValue('StringList', key, kTestValues['flutter.List']!)
-      ]);
-      await preferences.remove(key);
-      final Map<String, Object> all = await preferences.getAll();
-      expect(all[key], isNull);
-    });
+      testWidgets('clear', (WidgetTester _) async {
+        await preferences.clear();
+        final Map<String, Object> values = await preferences.getAll();
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
 
-    testWidgets('clearing', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'flutter.String', kTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.bool', kTestValues['flutter.bool']!),
-        preferences.setValue('Int', 'flutter.int', kTestValues['flutter.int']!),
-        preferences.setValue(
-            'Double', 'flutter.double', kTestValues['flutter.double']!),
-        preferences.setValue(
-            'StringList', 'flutter.List', kTestValues['flutter.List']!)
-      ]);
-      await preferences.clear();
-      final Map<String, Object> all = await preferences.getAll();
-      expect(all['flutter.String'], null);
-      expect(all['flutter.bool'], null);
-      expect(all['flutter.int'], null);
-      expect(all['flutter.double'], null);
-      expect(all['flutter.List'], null);
+      testWidgets('get all with prefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+      });
+
+      testWidgets('get all with allow list', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(
+              prefix: 'prefix.',
+              allowList: <String>{'prefix.String'},
+            ),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+      });
+
+      testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values['String'], allTestValues['String']);
+        expect(values['Bool'], allTestValues['Bool']);
+        expect(values['Int'], allTestValues['Int']);
+        expect(values['Double'], allTestValues['Double']);
+        expect(values['StringList'], allTestValues['StringList']);
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithParameters', (WidgetTester _) async {
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        Map<String, Object> values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], null);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'flutter.'),
+          ),
+        );
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithParameters with allow list',
+          (WidgetTester _) async {
+        await addData();
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(
+              prefix: 'prefix.',
+              allowList: <String>{'prefix.StringList'},
+            ),
+          ),
+        );
+        Map<String, Object> values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'flutter.'),
+          ),
+        );
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithNoPrefix', (WidgetTester _) async {
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values['String'], null);
+        expect(values['Bool'], null);
+        expect(values['Int'], null);
+        expect(values['Double'], null);
+        expect(values['StringList'], null);
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
     });
   });
 }
diff --git a/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml
index d67cd69..5687f49 100644
--- a/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml
@@ -16,6 +16,7 @@
     # The example app is bundled with the plugin so we use a path dependency on
     # the parent directory to use the current plugin's version.
     path: ../
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_driver:
diff --git a/packages/shared_preferences/shared_preferences_linux/lib/shared_preferences_linux.dart b/packages/shared_preferences/shared_preferences_linux/lib/shared_preferences_linux.dart
index 738ccdc..e9f9348 100644
--- a/packages/shared_preferences/shared_preferences_linux/lib/shared_preferences_linux.dart
+++ b/packages/shared_preferences/shared_preferences_linux/lib/shared_preferences_linux.dart
@@ -11,6 +11,7 @@
 import 'package:path/path.dart' as path;
 import 'package:path_provider_linux/path_provider_linux.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 /// The Linux implementation of [SharedPreferencesStorePlatform].
 ///
@@ -94,26 +95,52 @@
 
   @override
   Future<bool> clear() async {
-    return clearWithPrefix(_defaultPrefix);
+    return clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<bool> clearWithPrefix(String prefix) async {
+    return clearWithParameters(
+        ClearParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<bool> clearWithParameters(ClearParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
     final Map<String, Object> preferences = await _readPreferences();
-    preferences.removeWhere((String key, _) => key.startsWith(prefix));
+    preferences.removeWhere((String key, _) =>
+        key.startsWith(filter.prefix) &&
+        (filter.allowList == null || filter.allowList!.contains(key)));
     return _writePreferences(preferences);
   }
 
   @override
   Future<Map<String, Object>> getAll() async {
-    return getAllWithPrefix(_defaultPrefix);
+    return getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<Map<String, Object>> getAllWithPrefix(String prefix) async {
+    return getAllWithParameters(
+        GetAllParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<Map<String, Object>> getAllWithParameters(
+      GetAllParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
     final Map<String, Object> withPrefix =
         Map<String, Object>.from(await _readPreferences());
-    withPrefix.removeWhere((String key, _) => !key.startsWith(prefix));
+    withPrefix.removeWhere((String key, _) => !(key.startsWith(filter.prefix) &&
+        (filter.allowList?.contains(key) ?? true)));
     return withPrefix;
   }
 
diff --git a/packages/shared_preferences/shared_preferences_linux/pubspec.yaml b/packages/shared_preferences/shared_preferences_linux/pubspec.yaml
index 59ca5c4..b4a7656 100644
--- a/packages/shared_preferences/shared_preferences_linux/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_linux/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Linux implementation of the shared_preferences plugin
 repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_linux
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.2.0
+version: 2.3.0
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -22,7 +22,7 @@
   path: ^1.8.0
   path_provider_linux: ^2.0.0
   path_provider_platform_interface: ^2.0.0
-  shared_preferences_platform_interface: ^2.2.0
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart b/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart
index a4f2854..185feb5 100644
--- a/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart
+++ b/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart
@@ -10,6 +10,7 @@
 import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
 import 'package:shared_preferences_linux/shared_preferences_linux.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 void main() {
   late MemoryFileSystem fs;
@@ -98,6 +99,35 @@
     expect(values, prefixTestValues);
   });
 
+  test('getAllWithParameters', () async {
+    await writeTestFile(json.encode(allTestValues));
+    final SharedPreferencesLinux prefs = getPreferences();
+
+    final Map<String, Object> values = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(values, hasLength(5));
+    expect(values, prefixTestValues);
+  });
+
+  test('getAllWithParameters with allow list', () async {
+    await writeTestFile(json.encode(allTestValues));
+    final SharedPreferencesLinux prefs = getPreferences();
+
+    final Map<String?, Object?> all = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.Bool'},
+        ),
+      ),
+    );
+    expect(all.length, 1);
+    expect(all['prefix.Bool'], prefixTestValues['prefix.Bool']);
+  });
+
   test('remove', () async {
     await writeTestFile('{"key1":"one","key2":2}');
     final SharedPreferencesLinux prefs = getPreferences();
@@ -155,6 +185,74 @@
     final Map<String, Object> noValues = await prefs.getAllWithPrefix('');
     expect(noValues, hasLength(0));
   });
+
+  test('clearWithParameters', () async {
+    await writeTestFile(json.encode(flutterTestValues));
+    final SharedPreferencesLinux prefs = getPreferences();
+    await prefs.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    final Map<String, Object> noValues = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(noValues, hasLength(0));
+
+    final Map<String, Object> values = await prefs.getAll();
+    expect(values, hasLength(5));
+    expect(values, flutterTestValues);
+  });
+
+  test('clearWithParameters with allow list', () async {
+    await writeTestFile(json.encode(prefixTestValues));
+    final SharedPreferencesLinux prefs = getPreferences();
+    await prefs.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.StringList'},
+        ),
+      ),
+    );
+    final Map<String, Object> someValues = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(someValues, hasLength(4));
+  });
+
+  test('getAllWithNoPrefix', () async {
+    await writeTestFile(json.encode(allTestValues));
+    final SharedPreferencesLinux prefs = getPreferences();
+
+    final Map<String, Object> values = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(values, hasLength(15));
+    expect(values, allTestValues);
+  });
+
+  test('clearWithNoPrefix', () async {
+    await writeTestFile(json.encode(flutterTestValues));
+    final SharedPreferencesLinux prefs = getPreferences();
+    await prefs.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    final Map<String, Object> noValues = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(noValues, hasLength(0));
+  });
 }
 
 /// Fake implementation of PathProviderLinux that returns hard-coded paths,
diff --git a/packages/shared_preferences/shared_preferences_web/CHANGELOG.md b/packages/shared_preferences/shared_preferences_web/CHANGELOG.md
index a446c0c..437171f 100644
--- a/packages/shared_preferences/shared_preferences_web/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_web/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 2.2.0
 
+* Adds `clearWithParameters` and `getAllWithParameters` methods.
 * Updates minimum supported SDK version to Flutter 3.3/Dart 2.18.
 
 ## 2.1.0
diff --git a/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart b/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart
index 78237a8..53a47db 100644
--- a/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart
+++ b/packages/shared_preferences/shared_preferences_web/example/integration_test/shared_preferences_web_test.dart
@@ -8,6 +8,7 @@
 import 'package:integration_test/integration_test.dart';
 import 'package:shared_preferences_platform_interface/method_channel_shared_preferences.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 import 'package:shared_preferences_web/shared_preferences_web.dart';
 
 const Map<String, dynamic> kTestValues = <String, dynamic>{
@@ -21,94 +22,124 @@
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
 
-  group('SharedPreferencesPlugin', () {
-    setUp(() {
-      html.window.localStorage.clear();
-    });
+  setUp(() {
+    html.window.localStorage.clear();
+  });
 
-    testWidgets('registers itself', (WidgetTester tester) async {
-      SharedPreferencesStorePlatform.instance =
-          MethodChannelSharedPreferencesStore();
-      expect(SharedPreferencesStorePlatform.instance,
-          isNot(isA<SharedPreferencesPlugin>()));
-      SharedPreferencesPlugin.registerWith(null);
-      expect(SharedPreferencesStorePlatform.instance,
-          isA<SharedPreferencesPlugin>());
-    });
+  testWidgets('registers itself', (WidgetTester tester) async {
+    SharedPreferencesStorePlatform.instance =
+        MethodChannelSharedPreferencesStore();
+    expect(SharedPreferencesStorePlatform.instance,
+        isNot(isA<SharedPreferencesPlugin>()));
+    SharedPreferencesPlugin.registerWith(null);
+    expect(SharedPreferencesStorePlatform.instance,
+        isA<SharedPreferencesPlugin>());
+  });
 
-    const Map<String, Object> flutterTestValues = <String, Object>{
-      'flutter.String': 'hello world',
-      'flutter.Bool': true,
-      'flutter.Int': 42,
-      'flutter.Double': 3.14159,
-      'flutter.StringList': <String>['foo', 'bar'],
-    };
+  const Map<String, Object> flutterTestValues = <String, Object>{
+    'flutter.String': 'hello world',
+    'flutter.Bool': true,
+    'flutter.Int': 42,
+    'flutter.Double': 3.14159,
+    'flutter.StringList': <String>['foo', 'bar'],
+  };
 
-    const Map<String, Object> prefixTestValues = <String, Object>{
-      'prefix.String': 'hello world',
-      'prefix.Bool': true,
-      'prefix.Int': 42,
-      'prefix.Double': 3.14159,
-      'prefix.StringList': <String>['foo', 'bar'],
-    };
+  const Map<String, Object> prefixTestValues = <String, Object>{
+    'prefix.String': 'hello world',
+    'prefix.Bool': true,
+    'prefix.Int': 42,
+    'prefix.Double': 3.14159,
+    'prefix.StringList': <String>['foo', 'bar'],
+  };
 
-    const Map<String, Object> nonPrefixTestValues = <String, Object>{
-      'String': 'hello world',
-      'Bool': true,
-      'Int': 42,
-      'Double': 3.14159,
-      'StringList': <String>['foo', 'bar'],
-    };
+  const Map<String, Object> nonPrefixTestValues = <String, Object>{
+    'String': 'hello world',
+    'Bool': true,
+    'Int': 42,
+    'Double': 3.14159,
+    'StringList': <String>['foo', 'bar'],
+  };
 
-    final Map<String, Object> allTestValues = <String, Object>{};
+  final Map<String, Object> allTestValues = <String, Object>{};
 
-    allTestValues.addAll(flutterTestValues);
-    allTestValues.addAll(prefixTestValues);
-    allTestValues.addAll(nonPrefixTestValues);
+  allTestValues.addAll(flutterTestValues);
+  allTestValues.addAll(prefixTestValues);
+  allTestValues.addAll(nonPrefixTestValues);
 
-    late SharedPreferencesStorePlatform preferences;
+  late SharedPreferencesStorePlatform preferences;
 
+  setUp(() async {
+    preferences = SharedPreferencesStorePlatform.instance;
+  });
+
+  tearDown(() async {
+    await preferences.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+  });
+
+  testWidgets('reading', (WidgetTester _) async {
+    final Map<String, Object> values = await preferences.getAll();
+    expect(values.length, 0);
+  });
+
+  Future<void> addData() async {
+    await preferences.setValue('String', 'String', allTestValues['String']!);
+    await preferences.setValue('Bool', 'Bool', allTestValues['Bool']!);
+    await preferences.setValue('Int', 'Int', allTestValues['Int']!);
+    await preferences.setValue('Double', 'Double', allTestValues['Double']!);
+    await preferences.setValue(
+        'StringList', 'StringList', allTestValues['StringList']!);
+    await preferences.setValue(
+        'String', 'prefix.String', allTestValues['prefix.String']!);
+    await preferences.setValue(
+        'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!);
+    await preferences.setValue(
+        'Int', 'prefix.Int', allTestValues['prefix.Int']!);
+    await preferences.setValue(
+        'Double', 'prefix.Double', allTestValues['prefix.Double']!);
+    await preferences.setValue(
+        'StringList', 'prefix.StringList', allTestValues['prefix.StringList']!);
+    await preferences.setValue(
+        'String', 'flutter.String', allTestValues['flutter.String']!);
+    await preferences.setValue(
+        'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
+    await preferences.setValue(
+        'Int', 'flutter.Int', allTestValues['flutter.Int']!);
+    await preferences.setValue(
+        'Double', 'flutter.Double', allTestValues['flutter.Double']!);
+    await preferences.setValue('StringList', 'flutter.StringList',
+        allTestValues['flutter.StringList']!);
+  }
+
+  testWidgets('clear', (WidgetTester _) async {
+    await addData();
+    await preferences.clear();
+    final Map<String, Object> values = await preferences.getAll();
+    expect(values['flutter.String'], null);
+    expect(values['flutter.Bool'], null);
+    expect(values['flutter.Int'], null);
+    expect(values['flutter.Double'], null);
+    expect(values['flutter.StringList'], null);
+  });
+
+  group('withPrefix', () {
     setUp(() async {
-      preferences = SharedPreferencesStorePlatform.instance;
+      await addData();
     });
 
-    tearDown(() {
-      // ignore: deprecated_member_use
-      preferences.clearWithPrefix('');
+    testWidgets('remove', (WidgetTester _) async {
+      const String key = 'flutter.String';
+      await preferences.remove(key);
+      final Map<String, Object> values =
+          // ignore: deprecated_member_use
+          await preferences.getAllWithPrefix('');
+      expect(values[key], isNull);
     });
 
-    testWidgets('reading', (WidgetTester _) async {
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
-      expect(values['String'], isNull);
-      expect(values['Bool'], isNull);
-      expect(values['Int'], isNull);
-      expect(values['Double'], isNull);
-      expect(values['StringList'], isNull);
-    });
-
-    testWidgets('getAllWithPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'prefix.String', allTestValues['prefix.String']!),
-        preferences.setValue(
-            'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
-        preferences.setValue('Int', 'prefix.Int', allTestValues['prefix.Int']!),
-        preferences.setValue(
-            'Double', 'prefix.Double', allTestValues['prefix.Double']!),
-        preferences.setValue('StringList', 'prefix.StringList',
-            allTestValues['prefix.StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
+    testWidgets('get all with prefix', (WidgetTester _) async {
       final Map<String, Object> values =
           // ignore: deprecated_member_use
           await preferences.getAllWithPrefix('prefix.');
@@ -119,28 +150,23 @@
       expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
     });
 
+    testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+      final Map<String, Object> values =
+          // ignore: deprecated_member_use
+          await preferences.getAllWithPrefix('');
+      expect(values['String'], allTestValues['String']);
+      expect(values['Bool'], allTestValues['Bool']);
+      expect(values['Int'], allTestValues['Int']);
+      expect(values['Double'], allTestValues['Double']);
+      expect(values['StringList'], allTestValues['StringList']);
+      expect(values['flutter.String'], allTestValues['flutter.String']);
+      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+      expect(values['flutter.Int'], allTestValues['flutter.Int']);
+      expect(values['flutter.Double'], allTestValues['flutter.Double']);
+      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
+    });
+
     testWidgets('clearWithPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'prefix.String', allTestValues['prefix.String']!),
-        preferences.setValue(
-            'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!),
-        preferences.setValue('Int', 'prefix.Int', allTestValues['prefix.Int']!),
-        preferences.setValue(
-            'Double', 'prefix.Double', allTestValues['prefix.Double']!),
-        preferences.setValue('StringList', 'prefix.StringList',
-            allTestValues['prefix.StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
       // ignore: deprecated_member_use
       await preferences.clearWithPrefix('prefix.');
       Map<String, Object> values =
@@ -160,27 +186,76 @@
       expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
     });
 
-    testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue('String', 'String', allTestValues['String']!),
-        preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
-        preferences.setValue('Int', 'Int', allTestValues['Int']!),
-        preferences.setValue('Double', 'Double', allTestValues['Double']!),
-        preferences.setValue(
-            'StringList', 'StringList', allTestValues['StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
+    testWidgets('clearWithNoPrefix', (WidgetTester _) async {
       // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      await preferences.clearWithPrefix('');
+      final Map<String, Object> values =
+          // ignore: deprecated_member_use
+          await preferences.getAllWithPrefix('');
+      expect(values['String'], null);
+      expect(values['Bool'], null);
+      expect(values['Int'], null);
+      expect(values['Double'], null);
+      expect(values['StringList'], null);
+      expect(values['flutter.String'], null);
+      expect(values['flutter.Bool'], null);
+      expect(values['flutter.Int'], null);
+      expect(values['flutter.Double'], null);
+      expect(values['flutter.StringList'], null);
+    });
+  });
+
+  group('withParameters', () {
+    setUp(() async {
+      await addData();
+    });
+
+    testWidgets('remove', (WidgetTester _) async {
+      const String key = 'flutter.String';
+      await preferences.remove(key);
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
+      expect(values[key], isNull);
+    });
+
+    testWidgets('get all with prefix', (WidgetTester _) async {
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      expect(values['prefix.String'], allTestValues['prefix.String']);
+      expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+      expect(values['prefix.Int'], allTestValues['prefix.Int']);
+      expect(values['prefix.Double'], allTestValues['prefix.Double']);
+      expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+    });
+
+    testWidgets('get all with allow list', (WidgetTester _) async {
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(
+            prefix: 'prefix.',
+            allowList: <String>{'prefix.String'},
+          ),
+        ),
+      );
+      expect(values['prefix.String'], allTestValues['prefix.String']);
+      expect(values['prefix.Bool'], null);
+      expect(values['prefix.Int'], null);
+      expect(values['prefix.Double'], null);
+      expect(values['prefix.StringList'], null);
+    });
+
+    testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values['String'], allTestValues['String']);
       expect(values['Bool'], allTestValues['Bool']);
       expect(values['Int'], allTestValues['Int']);
@@ -193,29 +268,77 @@
       expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
     });
 
+    testWidgets('clearWithParameters', (WidgetTester _) async {
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      expect(values['prefix.String'], null);
+      expect(values['prefix.Bool'], null);
+      expect(values['prefix.Int'], null);
+      expect(values['prefix.Double'], null);
+      expect(values['prefix.StringList'], null);
+      values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'flutter.'),
+        ),
+      );
+      expect(values['flutter.String'], allTestValues['flutter.String']);
+      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+      expect(values['flutter.Int'], allTestValues['flutter.Int']);
+      expect(values['flutter.Double'], allTestValues['flutter.Double']);
+      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
+    });
+
+    testWidgets('clearWithParameters with allow list', (WidgetTester _) async {
+      await addData();
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(
+            prefix: 'prefix.',
+            allowList: <String>{'prefix.StringList'},
+          ),
+        ),
+      );
+      Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'prefix.'),
+        ),
+      );
+      expect(values['prefix.String'], allTestValues['prefix.String']);
+      expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+      expect(values['prefix.Int'], allTestValues['prefix.Int']);
+      expect(values['prefix.Double'], allTestValues['prefix.Double']);
+      expect(values['prefix.StringList'], null);
+      values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: 'flutter.'),
+        ),
+      );
+      expect(values['flutter.String'], allTestValues['flutter.String']);
+      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+      expect(values['flutter.Int'], allTestValues['flutter.Int']);
+      expect(values['flutter.Double'], allTestValues['flutter.Double']);
+      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
+    });
+
     testWidgets('clearWithNoPrefix', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue('String', 'String', allTestValues['String']!),
-        preferences.setValue('Bool', 'Bool', allTestValues['Bool']!),
-        preferences.setValue('Int', 'Int', allTestValues['Int']!),
-        preferences.setValue('Double', 'Double', allTestValues['Double']!),
-        preferences.setValue(
-            'StringList', 'StringList', allTestValues['StringList']!),
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      // ignore: deprecated_member_use
-      await preferences.clearWithPrefix('');
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
+      final Map<String, Object> values = await preferences.getAllWithParameters(
+        GetAllParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
       expect(values['String'], null);
       expect(values['Bool'], null);
       expect(values['Int'], null);
@@ -227,77 +350,23 @@
       expect(values['flutter.Double'], null);
       expect(values['flutter.StringList'], null);
     });
+  });
 
-    testWidgets('getAll', (WidgetTester _) async {
-      await Future.wait(<Future<bool>>[
-        preferences.setValue(
-            'String', 'flutter.String', allTestValues['flutter.String']!),
-        preferences.setValue(
-            'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!),
-        preferences.setValue(
-            'Int', 'flutter.Int', allTestValues['flutter.Int']!),
-        preferences.setValue(
-            'Double', 'flutter.Double', allTestValues['flutter.Double']!),
-        preferences.setValue('StringList', 'flutter.StringList',
-            allTestValues['flutter.StringList']!)
-      ]);
-      final Map<String, Object> values = await preferences.getAll();
-      expect(values['flutter.String'], allTestValues['flutter.String']);
-      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
-      expect(values['flutter.Int'], allTestValues['flutter.Int']);
-      expect(values['flutter.Double'], allTestValues['flutter.Double']);
-      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
-    });
-
-    testWidgets('remove', (WidgetTester _) async {
-      const String key = 'testKey';
-      await preferences.setValue(
-          'String', key, allTestValues['flutter.String']!);
-      await preferences.setValue('Bool', key, allTestValues['flutter.Bool']!);
-      await preferences.setValue('Int', key, allTestValues['flutter.Int']!);
-      await preferences.setValue(
-          'Double', key, allTestValues['flutter.Double']!);
-      await preferences.setValue(
-          'StringList', key, allTestValues['flutter.StringList']!);
-      await preferences.remove(key);
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
-      expect(values[key], isNull);
-    });
-
-    testWidgets('clear', (WidgetTester _) async {
-      await preferences.setValue(
-          'String', 'flutter.String', allTestValues['flutter.String']!);
-      await preferences.setValue(
-          'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
-      await preferences.setValue(
-          'Int', 'flutter.Int', allTestValues['flutter.Int']!);
-      await preferences.setValue(
-          'Double', 'flutter.Double', allTestValues['flutter.Double']!);
-      await preferences.setValue('StringList', 'flutter.StringList',
-          allTestValues['flutter.StringList']!);
-      await preferences.clear();
-      final Map<String, Object> values = await preferences.getAll();
-      expect(values['flutter.String'], null);
-      expect(values['flutter.Bool'], null);
-      expect(values['flutter.Int'], null);
-      expect(values['flutter.Double'], null);
-      expect(values['flutter.StringList'], null);
-    });
-
-    testWidgets('simultaneous writes', (WidgetTester _) async {
-      final List<Future<bool>> writes = <Future<bool>>[];
-      const int writeCount = 100;
-      for (int i = 1; i <= writeCount; i++) {
-        writes.add(preferences.setValue('Int', 'Int', i));
-      }
-      final List<bool> result = await Future.wait(writes, eagerError: true);
-      // All writes should succeed.
-      expect(result.where((bool element) => !element), isEmpty);
-      // The last write should win.
-      // ignore: deprecated_member_use
-      final Map<String, Object> values = await preferences.getAllWithPrefix('');
-      expect(values['Int'], writeCount);
-    });
+  testWidgets('simultaneous writes', (WidgetTester _) async {
+    final List<Future<bool>> writes = <Future<bool>>[];
+    const int writeCount = 100;
+    for (int i = 1; i <= writeCount; i++) {
+      writes.add(preferences.setValue('Int', 'Int', i));
+    }
+    final List<bool> result = await Future.wait(writes, eagerError: true);
+    // All writes should succeed.
+    expect(result.where((bool element) => !element), isEmpty);
+    // The last write should win.
+    final Map<String, Object> values = await preferences.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(values['Int'], writeCount);
   });
 }
diff --git a/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml
index 92ace9c..c812ea1 100644
--- a/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml
@@ -8,7 +8,7 @@
 dependencies:
   flutter:
     sdk: flutter
-  shared_preferences_platform_interface: ^2.0.0
+  shared_preferences_platform_interface: ^2.3.0
   shared_preferences_web:
     path: ../
 
diff --git a/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart b/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart
index 6ee692e..34c33ce 100644
--- a/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart
+++ b/packages/shared_preferences/shared_preferences_web/lib/shared_preferences_web.dart
@@ -8,6 +8,7 @@
 
 import 'package:flutter_web_plugins/flutter_web_plugins.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 /// The web implementation of [SharedPreferencesStorePlatform].
 ///
@@ -22,27 +23,52 @@
 
   @override
   Future<bool> clear() async {
-    return clearWithPrefix(_defaultPrefix);
+    return clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<bool> clearWithPrefix(String prefix) async {
+    return clearWithParameters(
+        ClearParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<bool> clearWithParameters(ClearParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
     // IMPORTANT: Do not use html.window.localStorage.clear() as that will
     //            remove _all_ local data, not just the keys prefixed with
     //            _prefix
-    _getStoredFlutterKeys(prefix).forEach(html.window.localStorage.remove);
+    _getFilteredKeys(filter.prefix, allowList: filter.allowList)
+        .forEach(html.window.localStorage.remove);
     return true;
   }
 
   @override
   Future<Map<String, Object>> getAll() async {
-    return getAllWithPrefix(_defaultPrefix);
+    return getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<Map<String, Object>> getAllWithPrefix(String prefix) async {
+    return getAllWithParameters(
+        GetAllParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<Map<String, Object>> getAllWithParameters(
+      GetAllParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
     final Map<String, Object> allData = <String, Object>{};
-    for (final String key in _getStoredFlutterKeys(prefix)) {
+    for (final String key
+        in _getFilteredKeys(filter.prefix, allowList: filter.allowList)) {
       allData[key] = _decodeValue(html.window.localStorage[key]!);
     }
     return allData;
@@ -60,9 +86,12 @@
     return true;
   }
 
-  Iterable<String> _getStoredFlutterKeys(String prefix) {
-    return html.window.localStorage.keys
-        .where((String key) => key.startsWith(prefix));
+  Iterable<String> _getFilteredKeys(
+    String prefix, {
+    Set<String>? allowList,
+  }) {
+    return html.window.localStorage.keys.where((String key) =>
+        key.startsWith(prefix) && (allowList?.contains(key) ?? true));
   }
 
   String _encodeValue(Object? value) {
diff --git a/packages/shared_preferences/shared_preferences_web/pubspec.yaml b/packages/shared_preferences/shared_preferences_web/pubspec.yaml
index f7f7903..5d88024 100644
--- a/packages/shared_preferences/shared_preferences_web/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_web/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Web platform implementation of shared_preferences
 repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_web
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.1.0
+version: 2.2.0
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -21,7 +21,7 @@
     sdk: flutter
   flutter_web_plugins:
     sdk: flutter
-  shared_preferences_platform_interface: ^2.2.0
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md b/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md
index b7c6410..b6f3ab2 100644
--- a/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md
+++ b/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md
@@ -1,5 +1,6 @@
-## NEXT
+## 2.3.0
 
+* Adds `clearWithParameters` and `getAllWithParameters` methods.
 * Updates minimum supported SDK version to Flutter 3.3/Dart 2.18.
 
 ## 2.2.0
diff --git a/packages/shared_preferences/shared_preferences_windows/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_windows/example/integration_test/shared_preferences_test.dart
index cef19a6..bd30dde 100644
--- a/packages/shared_preferences/shared_preferences_windows/example/integration_test/shared_preferences_test.dart
+++ b/packages/shared_preferences/shared_preferences_windows/example/integration_test/shared_preferences_test.dart
@@ -4,95 +4,336 @@
 
 import 'package:flutter_test/flutter_test.dart';
 import 'package:integration_test/integration_test.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 import 'package:shared_preferences_windows/shared_preferences_windows.dart';
 
 void main() {
   IntegrationTestWidgetsFlutterBinding.ensureInitialized();
 
   group('SharedPreferencesWindows', () {
-    const Map<String, Object> kTestValues = <String, Object>{
+    late SharedPreferencesWindows preferences;
+
+    const Map<String, Object> flutterTestValues = <String, Object>{
       'flutter.String': 'hello world',
-      'flutter.bool': true,
-      'flutter.int': 42,
-      'flutter.double': 3.14159,
-      'flutter.List': <String>['foo', 'bar'],
+      'flutter.Bool': true,
+      'flutter.Int': 42,
+      'flutter.Double': 3.14159,
+      'flutter.StringList': <String>['foo', 'bar'],
     };
 
-    const Map<String, Object> kTestValues2 = <String, Object>{
-      'flutter.String': 'goodbye world',
-      'flutter.bool': false,
-      'flutter.int': 1337,
-      'flutter.double': 2.71828,
-      'flutter.List': <String>['baz', 'quox'],
+    const Map<String, Object> prefixTestValues = <String, Object>{
+      'prefix.String': 'hello world',
+      'prefix.Bool': true,
+      'prefix.Int': 42,
+      'prefix.Double': 3.14159,
+      'prefix.StringList': <String>['foo', 'bar'],
     };
 
-    testWidgets('reading', (WidgetTester _) async {
-      final SharedPreferencesWindows preferences = SharedPreferencesWindows();
-      await preferences.clear();
-      final Map<String, Object> values = await preferences.getAll();
-      expect(values['String'], isNull);
-      expect(values['bool'], isNull);
-      expect(values['int'], isNull);
-      expect(values['double'], isNull);
-      expect(values['List'], isNull);
+    const Map<String, Object> nonPrefixTestValues = <String, Object>{
+      'String': 'hello world',
+      'Bool': true,
+      'Int': 42,
+      'Double': 3.14159,
+      'StringList': <String>['foo', 'bar'],
+    };
+
+    final Map<String, Object> allTestValues = <String, Object>{};
+
+    allTestValues.addAll(flutterTestValues);
+    allTestValues.addAll(prefixTestValues);
+    allTestValues.addAll(nonPrefixTestValues);
+
+    Future<void> addData() async {
+      await preferences.setValue('String', 'String', allTestValues['String']!);
+      await preferences.setValue('Bool', 'Bool', allTestValues['Bool']!);
+      await preferences.setValue('Int', 'Int', allTestValues['Int']!);
+      await preferences.setValue('Double', 'Double', allTestValues['Double']!);
+      await preferences.setValue(
+          'StringList', 'StringList', allTestValues['StringList']!);
+      await preferences.setValue(
+          'String', 'prefix.String', allTestValues['prefix.String']!);
+      await preferences.setValue(
+          'Bool', 'prefix.Bool', allTestValues['prefix.Bool']!);
+      await preferences.setValue(
+          'Int', 'prefix.Int', allTestValues['prefix.Int']!);
+      await preferences.setValue(
+          'Double', 'prefix.Double', allTestValues['prefix.Double']!);
+      await preferences.setValue('StringList', 'prefix.StringList',
+          allTestValues['prefix.StringList']!);
+      await preferences.setValue(
+          'String', 'flutter.String', allTestValues['flutter.String']!);
+      await preferences.setValue(
+          'Bool', 'flutter.Bool', allTestValues['flutter.Bool']!);
+      await preferences.setValue(
+          'Int', 'flutter.Int', allTestValues['flutter.Int']!);
+      await preferences.setValue(
+          'Double', 'flutter.Double', allTestValues['flutter.Double']!);
+      await preferences.setValue('StringList', 'flutter.StringList',
+          allTestValues['flutter.StringList']!);
+    }
+
+    setUp(() async {
+      preferences = SharedPreferencesWindows();
+      await addData();
     });
 
-    testWidgets('writing', (WidgetTester _) async {
-      final SharedPreferencesWindows preferences = SharedPreferencesWindows();
-      await preferences.clear();
-      await preferences.setValue(
-          'String', 'flutter.String', kTestValues2['flutter.String']!);
-      await preferences.setValue(
-          'Bool', 'flutter.bool', kTestValues2['flutter.bool']!);
-      await preferences.setValue(
-          'Int', 'flutter.int', kTestValues2['flutter.int']!);
-      await preferences.setValue(
-          'Double', 'flutter.double', kTestValues2['flutter.double']!);
-      await preferences.setValue(
-          'StringList', 'flutter.List', kTestValues2['flutter.List']!);
-      final Map<String, Object> values = await preferences.getAll();
-      expect(values['flutter.String'], kTestValues2['flutter.String']);
-      expect(values['flutter.bool'], kTestValues2['flutter.bool']);
-      expect(values['flutter.int'], kTestValues2['flutter.int']);
-      expect(values['flutter.double'], kTestValues2['flutter.double']);
-      expect(values['flutter.List'], kTestValues2['flutter.List']);
+    tearDown(() async {
+      await preferences.clearWithParameters(
+        ClearParameters(
+          filter: PreferencesFilter(prefix: ''),
+        ),
+      );
     });
 
-    testWidgets('removing', (WidgetTester _) async {
-      final SharedPreferencesWindows preferences = SharedPreferencesWindows();
-      await preferences.clear();
-      const String key = 'flutter.testKey';
-      await preferences.setValue('String', key, kTestValues['flutter.String']!);
-      await preferences.setValue('Bool', key, kTestValues['flutter.bool']!);
-      await preferences.setValue('Int', key, kTestValues['flutter.int']!);
-      await preferences.setValue('Double', key, kTestValues['flutter.double']!);
-      await preferences.setValue(
-          'StringList', key, kTestValues['flutter.List']!);
-      await preferences.remove(key);
+    testWidgets('getAll', (WidgetTester _) async {
       final Map<String, Object> values = await preferences.getAll();
-      expect(values[key], isNull);
+      expect(values['flutter.String'], allTestValues['flutter.String']);
+      expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+      expect(values['flutter.Int'], allTestValues['flutter.Int']);
+      expect(values['flutter.Double'], allTestValues['flutter.Double']);
+      expect(values['flutter.StringList'], allTestValues['flutter.StringList']);
     });
 
-    testWidgets('clearing', (WidgetTester _) async {
-      final SharedPreferencesWindows preferences = SharedPreferencesWindows();
-      await preferences.clear();
-      await preferences.setValue(
-          'String', 'flutter.String', kTestValues['flutter.String']!);
-      await preferences.setValue(
-          'Bool', 'flutter.bool', kTestValues['flutter.bool']!);
-      await preferences.setValue(
-          'Int', 'flutter.int', kTestValues['flutter.int']!);
-      await preferences.setValue(
-          'Double', 'flutter.double', kTestValues['flutter.double']!);
-      await preferences.setValue(
-          'StringList', 'flutter.List', kTestValues['flutter.List']!);
-      await preferences.clear();
-      final Map<String, Object> values = await preferences.getAll();
-      expect(values['flutter.String'], null);
-      expect(values['flutter.bool'], null);
-      expect(values['flutter.int'], null);
-      expect(values['flutter.double'], null);
-      expect(values['flutter.List'], null);
+    group('withPrefix', () {
+      testWidgets('remove', (WidgetTester _) async {
+        const String key = 'flutter.String';
+        await preferences.remove(key);
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('');
+        expect(values[key], isNull);
+      });
+
+      testWidgets('clear', (WidgetTester _) async {
+        await preferences.clear();
+        final Map<String, Object> values = await preferences.getAll();
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
+
+      testWidgets('get all with prefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('prefix.');
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+      });
+
+      testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], allTestValues['String']);
+        expect(values['Bool'], allTestValues['Bool']);
+        expect(values['Int'], allTestValues['Int']);
+        expect(values['Double'], allTestValues['Double']);
+        expect(values['StringList'], allTestValues['StringList']);
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithPrefix', (WidgetTester _) async {
+        await preferences.clearWithPrefix('prefix.');
+        Map<String, Object> values =
+            await preferences.getAllWithPrefix('prefix.');
+        expect(values['prefix.String'], null);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithPrefix('flutter.');
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithNoPrefix', (WidgetTester _) async {
+        await preferences.clearWithPrefix('');
+        final Map<String, Object> values =
+            await preferences.getAllWithPrefix('');
+        expect(values['String'], null);
+        expect(values['Bool'], null);
+        expect(values['Int'], null);
+        expect(values['Double'], null);
+        expect(values['StringList'], null);
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
+    });
+
+    group('withParameters', () {
+      testWidgets('remove', (WidgetTester _) async {
+        const String key = 'flutter.String';
+        await preferences.remove(key);
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values[key], isNull);
+      });
+
+      testWidgets('clear', (WidgetTester _) async {
+        await preferences.clear();
+        final Map<String, Object> values = await preferences.getAll();
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
+
+      testWidgets('get all with prefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], allTestValues['prefix.StringList']);
+      });
+
+      testWidgets('get all with allow list', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(
+              prefix: 'prefix.',
+              allowList: <String>{'prefix.String'},
+            ),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+      });
+
+      testWidgets('getAllWithNoPrefix', (WidgetTester _) async {
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values['String'], allTestValues['String']);
+        expect(values['Bool'], allTestValues['Bool']);
+        expect(values['Int'], allTestValues['Int']);
+        expect(values['Double'], allTestValues['Double']);
+        expect(values['StringList'], allTestValues['StringList']);
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithParameters', (WidgetTester _) async {
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        Map<String, Object> values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], null);
+        expect(values['prefix.Bool'], null);
+        expect(values['prefix.Int'], null);
+        expect(values['prefix.Double'], null);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'flutter.'),
+          ),
+        );
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithParameters with allow list',
+          (WidgetTester _) async {
+        await addData();
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(
+              prefix: 'prefix.',
+              allowList: <String>{'prefix.StringList'},
+            ),
+          ),
+        );
+        Map<String, Object> values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'prefix.'),
+          ),
+        );
+        expect(values['prefix.String'], allTestValues['prefix.String']);
+        expect(values['prefix.Bool'], allTestValues['prefix.Bool']);
+        expect(values['prefix.Int'], allTestValues['prefix.Int']);
+        expect(values['prefix.Double'], allTestValues['prefix.Double']);
+        expect(values['prefix.StringList'], null);
+        values = await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: 'flutter.'),
+          ),
+        );
+        expect(values['flutter.String'], allTestValues['flutter.String']);
+        expect(values['flutter.Bool'], allTestValues['flutter.Bool']);
+        expect(values['flutter.Int'], allTestValues['flutter.Int']);
+        expect(values['flutter.Double'], allTestValues['flutter.Double']);
+        expect(
+            values['flutter.StringList'], allTestValues['flutter.StringList']);
+      });
+
+      testWidgets('clearWithNoPrefix', (WidgetTester _) async {
+        await preferences.clearWithParameters(
+          ClearParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        final Map<String, Object> values =
+            await preferences.getAllWithParameters(
+          GetAllParameters(
+            filter: PreferencesFilter(prefix: ''),
+          ),
+        );
+        expect(values['String'], null);
+        expect(values['Bool'], null);
+        expect(values['Int'], null);
+        expect(values['Double'], null);
+        expect(values['StringList'], null);
+        expect(values['flutter.String'], null);
+        expect(values['flutter.Bool'], null);
+        expect(values['flutter.Int'], null);
+        expect(values['flutter.Double'], null);
+        expect(values['flutter.StringList'], null);
+      });
     });
   });
 }
diff --git a/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml
index f0280cb..180549b 100644
--- a/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml
@@ -9,6 +9,7 @@
 dependencies:
   flutter:
     sdk: flutter
+  shared_preferences_platform_interface: ^2.3.0
   shared_preferences_windows:
     # When depending on this package from a real application you should use:
     #   shared_preferences_windows: ^x.y.z
diff --git a/packages/shared_preferences/shared_preferences_windows/lib/shared_preferences_windows.dart b/packages/shared_preferences/shared_preferences_windows/lib/shared_preferences_windows.dart
index 6343759..097e0a6 100644
--- a/packages/shared_preferences/shared_preferences_windows/lib/shared_preferences_windows.dart
+++ b/packages/shared_preferences/shared_preferences_windows/lib/shared_preferences_windows.dart
@@ -11,6 +11,7 @@
 import 'package:path/path.dart' as path;
 import 'package:path_provider_windows/path_provider_windows.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 
 /// The Windows implementation of [SharedPreferencesStorePlatform].
 ///
@@ -100,26 +101,52 @@
 
   @override
   Future<bool> clear() async {
-    return clearWithPrefix(_defaultPrefix);
+    return clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<bool> clearWithPrefix(String prefix) async {
+    return clearWithParameters(
+        ClearParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<bool> clearWithParameters(ClearParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
     final Map<String, Object> preferences = await _readPreferences();
-    preferences.removeWhere((String key, _) => key.startsWith(prefix));
+    preferences.removeWhere((String key, _) =>
+        key.startsWith(filter.prefix) &&
+        (filter.allowList == null || filter.allowList!.contains(key)));
     return _writePreferences(preferences);
   }
 
   @override
   Future<Map<String, Object>> getAll() async {
-    return getAllWithPrefix(_defaultPrefix);
+    return getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: _defaultPrefix),
+      ),
+    );
   }
 
   @override
   Future<Map<String, Object>> getAllWithPrefix(String prefix) async {
+    return getAllWithParameters(
+        GetAllParameters(filter: PreferencesFilter(prefix: prefix)));
+  }
+
+  @override
+  Future<Map<String, Object>> getAllWithParameters(
+      GetAllParameters parameters) async {
+    final PreferencesFilter filter = parameters.filter;
     final Map<String, Object> withPrefix =
         Map<String, Object>.from(await _readPreferences());
-    withPrefix.removeWhere((String key, _) => !key.startsWith(prefix));
+    withPrefix.removeWhere((String key, _) => !(key.startsWith(filter.prefix) &&
+        (filter.allowList?.contains(key) ?? true)));
     return withPrefix;
   }
 
diff --git a/packages/shared_preferences/shared_preferences_windows/pubspec.yaml b/packages/shared_preferences/shared_preferences_windows/pubspec.yaml
index 03e3880..ea42634 100644
--- a/packages/shared_preferences/shared_preferences_windows/pubspec.yaml
+++ b/packages/shared_preferences/shared_preferences_windows/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Windows implementation of shared_preferences
 repository: https://github.com/flutter/packages/tree/main/packages/shared_preferences/shared_preferences_windows
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+shared_preferences%22
-version: 2.2.0
+version: 2.3.0
 
 environment:
   sdk: ">=2.18.0 <4.0.0"
@@ -22,7 +22,7 @@
   path: ^1.8.0
   path_provider_platform_interface: ^2.0.0
   path_provider_windows: ^2.0.0
-  shared_preferences_platform_interface: ^2.2.0
+  shared_preferences_platform_interface: ^2.3.0
 
 dev_dependencies:
   flutter_test:
diff --git a/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart b/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart
index c23ac46..499a74e 100644
--- a/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart
+++ b/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart
@@ -10,6 +10,7 @@
 import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
 import 'package:path_provider_windows/path_provider_windows.dart';
 import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
+import 'package:shared_preferences_platform_interface/types.dart';
 import 'package:shared_preferences_windows/shared_preferences_windows.dart';
 
 void main() {
@@ -99,6 +100,35 @@
     expect(values, prefixTestValues);
   });
 
+  test('getAllWithParameters with Prefix', () async {
+    await writeTestFile(json.encode(allTestValues));
+    final SharedPreferencesWindows prefs = getPreferences();
+
+    final Map<String, Object> values = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(values, hasLength(5));
+    expect(values, prefixTestValues);
+  });
+
+  test('getAllWithParameters with Prefix with allow list', () async {
+    await writeTestFile(json.encode(allTestValues));
+    final SharedPreferencesWindows prefs = getPreferences();
+
+    final Map<String?, Object?> all = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.Bool'},
+        ),
+      ),
+    );
+    expect(all.length, 1);
+    expect(all['prefix.Bool'], prefixTestValues['prefix.Bool']);
+  });
+
   test('remove', () async {
     await writeTestFile('{"key1":"one","key2":2}');
     final SharedPreferencesWindows prefs = getPreferences();
@@ -156,6 +186,74 @@
     final Map<String, Object> noValues = await prefs.getAllWithPrefix('');
     expect(noValues, hasLength(0));
   });
+
+  test('clearWithParameters with Prefix', () async {
+    await writeTestFile(json.encode(flutterTestValues));
+    final SharedPreferencesWindows prefs = getPreferences();
+    await prefs.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    final Map<String, Object> noValues = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(noValues, hasLength(0));
+
+    final Map<String, Object> values = await prefs.getAll();
+    expect(values, hasLength(5));
+    expect(values, flutterTestValues);
+  });
+
+  test('clearWithParameters with allow list', () async {
+    await writeTestFile(json.encode(prefixTestValues));
+    final SharedPreferencesWindows prefs = getPreferences();
+    await prefs.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(
+          prefix: 'prefix.',
+          allowList: <String>{'prefix.StringList'},
+        ),
+      ),
+    );
+    final Map<String, Object> noValues = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: 'prefix.'),
+      ),
+    );
+    expect(noValues, hasLength(4));
+  });
+
+  test('getAllWithNoPrefix', () async {
+    await writeTestFile(json.encode(allTestValues));
+    final SharedPreferencesWindows prefs = getPreferences();
+
+    final Map<String, Object> values = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(values, hasLength(15));
+    expect(values, allTestValues);
+  });
+
+  test('clearWithNoPrefix', () async {
+    await writeTestFile(json.encode(flutterTestValues));
+    final SharedPreferencesWindows prefs = getPreferences();
+    await prefs.clearWithParameters(
+      ClearParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    final Map<String, Object> noValues = await prefs.getAllWithParameters(
+      GetAllParameters(
+        filter: PreferencesFilter(prefix: ''),
+      ),
+    );
+    expect(noValues, hasLength(0));
+  });
 }
 
 /// Fake implementation of PathProviderWindows that returns hard-coded paths,