Flutter跨应用组共享偏好设置插件shared_preference_app_group的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter跨应用组共享偏好设置插件shared_preference_app_group的使用

Shared preferences with App Group

pub package

shared_preference_app_group 插件支持 iOS 应用组(App Group)功能,通过使用 -[NSUserDefaults initWithSuiteName:] 实现了偏好设置在应用组中的共享。

注意: 仅支持iOS平台

使用方法 Usage

要使用此插件,您需要将 shared_preference_app_group 添加为 依赖项到您的 pubspec.yaml 文件中

示例代码 Example

以下是一个完整的示例应用程序,展示了如何使用 shared_preference_app_group 插件来设置、获取和移除偏好设置。请确保首先在Xcode项目中为Runner Target启用AppGroup能力,并通过setAppGroup函数设置应用组ID。

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:shared_preference_app_group/shared_preference_app_group.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {

  // 填入在Xcode项目中设置的应用组ID
  String appGroupID = 'group.com.example.your_awesome_project';

  Map<String, dynamic> myParams = {
    'MY_BOOL_KEY': false,
    'MY_STRING_KEY': 'null',
    'MY_INT_KEY': 0,
    'MY_DOUBLE_KEY': 0.1
  };

  String displayParamsText = '';

  @override
  void initState() {
    super.initState();
    // 必须首先设置应用组
    SharedPreferenceAppGroup.setAppGroup(appGroupID);
  }

  void setMyParams() async {
    await SharedPreferenceAppGroup.setBool('MY_BOOL_KEY', true);
    await SharedPreferenceAppGroup.setString('MY_STRING_KEY', 'STRING_VALUE');
    await SharedPreferenceAppGroup.setInt('MY_INT_KEY', 42);
    await SharedPreferenceAppGroup.setDouble('MY_DOUBLE_KEY', 9.9);
    await SharedPreferenceAppGroup.setStringList('MY_STRING_ARRAY', ["element1", "element2", "element3"]);
  }

  Future<void> getMyParams() async {
    bool boolValue = await SharedPreferenceAppGroup.getBool('MY_BOOL_KEY') ?? false;
    String stringValue = await SharedPreferenceAppGroup.getString('MY_STRING_KEY') ?? 'null';
    int intValue = await SharedPreferenceAppGroup.getInt('MY_INT_KEY') ?? 0;
    double doubleValue = await SharedPreferenceAppGroup.getDouble('MY_DOUBLE_KEY') ?? 0.0;
    List<String> stringArrayValue = await SharedPreferenceAppGroup.getStringList('MY_STRING_ARRAY') ?? [];

    this.myParams = {
      'MY_BOOL_KEY': boolValue,
      'MY_STRING_KEY': stringValue,
      'MY_INT_KEY': intValue,
      'MY_DOUBLE_KEY': doubleValue,
      'MY_STRING_ARRAY': stringArrayValue
    };

    String text = '';
    for (String key in this.myParams.keys) {
      text += '$key = ${this.myParams[key]}\n';
    }

    setState(() {
      this.displayParamsText = text;
    });
  }

  Future<void> getAllParams() async {
    Map<String, dynamic> allPreferences = await SharedPreferenceAppGroup.getAll();

    String text = '';
    for (String key in allPreferences.keys) {
      text += '$key = ${allPreferences[key]}\n'; // 更正为 allPreferences
    }

    setState(() {
      this.displayParamsText = text;
    });
  }

  Future<void> removeMyParams() async {
    await SharedPreferenceAppGroup.remove('MY_BOOL_KEY');
    await SharedPreferenceAppGroup.remove('MY_STRING_KEY');
    await SharedPreferenceAppGroup.remove('MY_INT_KEY');
    await SharedPreferenceAppGroup.remove('MY_DOUBLE_KEY');
  }

  Future<void> removeAll() async {
    await SharedPreferenceAppGroup.removeAll();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Container(
            padding: const EdgeInsets.symmetric(horizontal: 40.0),
            child: ListView(
              children: [
                Padding(padding: const EdgeInsets.only(top: 50.0)),
                Text('Only support iOS'),
                Padding(padding: const EdgeInsets.only(top: 10.0)),
                Text('You should first enable the AppGroup capability for the Runner Target of your Xcode project, and then set the app group id to this plugin through `setAppGroup` function',
                  style: TextStyle(
                    fontSize: 11.0,
                  ),
                ),
                Padding(padding: const EdgeInsets.only(top: 10.0)),
                Container(
                  padding: const EdgeInsets.all(0.0),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(12.0),
                    color: Color(0xff0e88eb),
                  ),
                  width: 240.0,
                  height: 50.0,
                  child: CupertinoButton(
                    child: Text('SetParams',
                      style: TextStyle(
                        color: Colors.white
                      ),
                    ),
                    onPressed: setMyParams,
                  ),
                ),
                Padding(padding: const EdgeInsets.only(top: 10.0)),
                Container(
                  padding: const EdgeInsets.all(0.0),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(12.0),
                    color: Color(0xff0e88eb),
                  ),
                  width: 240.0,
                  height: 50.0,
                  child: CupertinoButton(
                    child: Text('RemoveParams',
                      style: TextStyle(
                        color: Colors.white,
                      ),
                    ),
                    onPressed: removeMyParams,
                  ),
                ),
                Padding(padding: const EdgeInsets.only(top: 10.0)),
                Container(
                  padding: const EdgeInsets.all(0.0),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(12.0),
                    color: Color(0xff0e88eb),
                  ),
                  width: 240.0,
                  height: 50.0,
                  child: CupertinoButton(
                    child: Text('RemoveAll',
                      style: TextStyle(
                        color: Colors.white
                      ),
                    ),
                    onPressed: removeAll,
                  ),
                ),
                Padding(padding: const EdgeInsets.only(top: 10.0)),
                Container(
                  padding: const EdgeInsets.all(0.0),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(12.0),
                    color: Color(0xff0b5eda),
                  ),
                  width: 240.0,
                  height: 50.0,
                  child: CupertinoButton(
                    child: Text('GetAllParams',
                      style: TextStyle(
                        color: Colors.white
                      ),
                    ),
                    onPressed: getAllParams,
                  ),
                ),
                Padding(padding: const EdgeInsets.only(top: 10.0)),
                Container(
                  padding: const EdgeInsets.all(0.0),
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.circular(12.0),
                    color: Color(0xff0b5eda),
                  ),
                  width: 240.0,
                  height: 50.0,
                  child: CupertinoButton(
                    child: Text('GetMyParams',
                      style: TextStyle(
                        color: Colors.white
                      ),
                    ),
                    onPressed: getMyParams,
                  ),
                ),
                Padding(padding: const EdgeInsets.only(top: 10.0)),
                Text(displayParamsText,
                  style: TextStyle(
                    fontSize: 11.0,
                  ),
                ),
              ],
            )
          )
        ),
      ),
    );
  }
}

相关项目 Related projects

如果您需要实现屏幕录制功能,我开发了一些有用的插件:

  • iOS: ReplayKit Launcher: 一个用于打开iOS上的RPSystemBroadcastPickerView的Flutter插件。
  • Android: MediaProjection Creator: 一个用于创建Android上的MediaProjection实例(包括请求权限)的Flutter插件。

另一个实用的演示:

贡献 Contributing

欢迎所有人通过提交Pull Request贡献代码、帮助回答问题、添加文档或以其他方式提供帮助。


更多关于Flutter跨应用组共享偏好设置插件shared_preference_app_group的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter跨应用组共享偏好设置插件shared_preference_app_group的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 shared_preference_app_group 插件在 Flutter 中实现跨应用组共享偏好设置的示例代码。这个插件允许你在同一个应用组内的不同应用之间共享偏好设置。

首先,确保你的 Flutter 项目已经添加了 shared_preference_app_group 依赖。你可以在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences_app_group: ^0.2.0  # 请使用最新版本号

然后运行 flutter pub get 来获取依赖。

配置 iOS 应用组

对于 iOS,你需要在 Xcode 中配置应用组。

  1. 打开 Xcode,选择你的项目。
  2. 选择目标(Target),然后转到 “Signing & Capabilities” 标签。
  3. 在 “Capabilities” 部分启用 “App Groups”。
  4. 添加一个新的 App Group,并为其指定一个唯一的标识符,例如 group.com.example.myappgroup

配置 Android 应用组

对于 Android,你需要在 AndroidManifest.xml 中配置应用组。

  1. 打开 android/app/src/main/AndroidManifest.xml 文件。
  2. 添加以下权限和元数据:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">

    <application
        ... >
        
        <!-- 添加应用组元数据 -->
        <meta-data
            android:name="com.google.android.gms.appgroup"
            android:value="@string/app_group_id" />

        <!-- 其他配置 -->
        ...
    </application>

    <!-- 添加必要的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

</manifest>
  1. res/values/strings.xml 文件中添加应用组 ID:
<resources>
    <string name="app_name">MyApp</string>
    <string name="app_group_id">com.example.myappgroup</string>
</resources>

Flutter 代码实现

下面是一个完整的 Flutter 代码示例,演示如何使用 shared_preference_app_group 插件进行跨应用组共享偏好设置:

import 'package:flutter/material.dart';
import 'package:shared_preferences_app_group/shared_preferences_app_group.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter App Group Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String? appGroupValue;

  @override
  void initState() {
    super.initState();
    _initPreferences();
  }

  Future<void> _initPreferences() async {
    SharedPreferencesAppGroup preferences = await SharedPreferencesAppGroup.getInstance(
      appGroupId: 'group.com.example.myappgroup', // 这里替换为你的应用组 ID
    );

    // 获取存储的值
    String? value = await preferences.getString('my_key');
    setState(() {
      appGroupValue = value;
    });
  }

  Future<void> _savePreferences() async {
    SharedPreferencesAppGroup preferences = await SharedPreferencesAppGroup.getInstance(
      appGroupId: 'group.com.example.myappgroup', // 这里替换为你的应用组 ID
    );

    // 设置存储的值
    await preferences.setString('my_key', 'Hello, App Group!');

    // 重新获取并更新 UI
    setState(() async {
      String? newValue = await preferences.getString('my_key');
      appGroupValue = newValue;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter App Group Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'App Group Value: ${appGroupValue ?? 'Loading...'}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _savePreferences,
              child: Text('Save Value'),
            ),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何在 Flutter 应用中使用 shared_preferences_app_group 插件来读取和写入跨应用组共享的偏好设置。确保你已经正确配置了 iOS 和 Android 的应用组 ID,并且在代码中使用相同的 ID。

回到顶部