Flutter共享偏好设置内容提供插件shared_preferences_content_provider的使用

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

Flutter共享偏好设置内容提供插件shared_preferences_content_provider的使用

shared_preferences_content_provider 是一个支持 Android 内容提供者的共享偏好设置插件。它允许你在多个应用程序之间共享 SharedPreferences 数据,但仅限于 Android 平台。

使用方法

要使用此插件,请在你的 pubspec.yaml 文件中添加 shared_preferences_content_provider 作为依赖项。

示例

1. 修改 AndroidManifest.xml

你需要根据应用程序的角色(提供者应用或消费者应用)修改 AndroidManifest.xml 文件。

提供者应用 (Host App)
<manifest>
    <application>
         <provider
           android:name="com.zhgwu.shared_preferences_content_provider.SharedPreferencesContentProvider"
           android:authorities="your_authority"  <!-- 替换为你的 authority -->
           android:readPermission="shared_preferences.permission.READ_DATA"
           android:writePermission="shared_preferences.permission.WRITE_DATA"
           android:enabled="true"
           android:exported="true" />
    </application>
</manifest>
消费者应用 (Consumer App)
<manifest>
    <queries>
        <package android:name="com.example.host" />  <!-- 替换为提供者应用的包名 -->
    </queries>
    <uses-permission android:name="shared_preferences.permission.WRITE_DATA" />
    <uses-permission android:name="shared_preferences.permission.READ_DATA" />
</manifest>
2. 初始化 SharedPreferencesContentProvider

在 Dart 代码中,首先需要初始化 SharedPreferencesContentProvider,并传入提供者的 authority

// The content provider must be set up first
await SharedPreferencesContentProvider.init(
    providerAuthority: 'your_authority',  // 替换为 AndroidManifest.xml 中的 authority
);
3. 存储和读取数据

你可以使用 putBoolputStringputIntputDouble 方法来存储不同类型的数据。使用 get 方法可以读取这些数据。

// Put values
await SharedPreferencesContentProvider.putBool('MY_BOOL_KEY', true);
await SharedPreferencesContentProvider.putString('MY_STRING_KEY', 'STRING_VALUE');
await SharedPreferencesContentProvider.putInt('MY_INT_KEY', 42);
await SharedPreferencesContentProvider.putDouble('MY_DOUBLE_KEY', 9.9);

// Get values
final bool boolValue = await SharedPreferencesContentProvider.get('MY_BOOL_KEY');
final String stringValue = await SharedPreferencesContentProvider.get('MY_STRING_KEY');
final int intValue = await SharedPreferencesContentProvider.get('MY_INT_KEY');
final double doubleValue = await SharedPreferencesContentProvider.get('MY_DOUBLE_KEY');

你也可以使用 getAll 方法获取所有存储的数据:

final Map<String, dynamic> data = await SharedPreferencesContentProvider.getAll();
4. 监听数据变化

你可以监听特定键值的变化,或者监听所有键值的变化。

// Listen when value change value of key ('123') change
SharedPreferencesContentProvider.listen((event) {
    print(event);
}, 
key: '123',  // 如果你想监听所有变化,移除此行
);

完整示例 Demo

以下是一个完整的示例,展示了如何在 Flutter 应用中使用 shared_preferences_content_provider 插件。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化 SharedPreferencesContentProvider
  await SharedPreferencesContentProvider.init(
    providerAuthority: 'your_authority',  // 替换为 AndroidManifest.xml 中的 authority
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  String _stringValue = '';
  bool _boolValue = false;
  int _intValue = 0;
  double _doubleValue = 0.0;

  [@override](/user/override)
  void initState() {
    super.initState();
    _loadData();
  }

  Future<void> _loadData() async {
    // 读取存储的数据
    final String stringValue = await SharedPreferencesContentProvider.get('MY_STRING_KEY') ?? '';
    final bool boolValue = await SharedPreferencesContentProvider.get('MY_BOOL_KEY') ?? false;
    final int intValue = await SharedPreferencesContentProvider.get('MY_INT_KEY') ?? 0;
    final double doubleValue = await SharedPreferencesContentProvider.get('MY_DOUBLE_KEY') ?? 0.0;

    setState(() {
      _stringValue = stringValue;
      _boolValue = boolValue;
      _intValue = intValue;
      _doubleValue = doubleValue;
    });
  }

  Future<void> _saveData() async {
    // 存储数据
    await SharedPreferencesContentProvider.putString('MY_STRING_KEY', 'Hello, World!');
    await SharedPreferencesContentProvider.putBool('MY_BOOL_KEY', true);
    await SharedPreferencesContentProvider.putInt('MY_INT_KEY', 42);
    await SharedPreferencesContentProvider.putDouble('MY_DOUBLE_KEY', 9.9);

    // 重新加载数据以反映更改
    await _loadData();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Content Provider Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            Text('String Value: $_stringValue'),
            Text('Bool Value: $_boolValue'),
            Text('Int Value: $_intValue'),
            Text('Double Value: $_doubleValue'),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _saveData,
              child: Text('Save Data'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter中使用shared_preferences_content_provider插件的示例代码。这个插件主要用于在Android平台上通过内容提供者(Content Provider)来共享SharedPreferences数据。这在与其他应用进行数据共享时非常有用。

首先,确保你已经在pubspec.yaml文件中添加了shared_preferencesshared_preferences_content_provider依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.15  # 请检查最新版本号
  shared_preferences_content_provider: ^0.1.0  # 请检查最新版本号

然后,运行flutter pub get来安装这些依赖。

接下来,让我们编写一些代码来演示如何使用这个插件。

1. 初始化SharedPreferences

在你的Flutter应用的某个位置(如main.dart)初始化SharedPreferences:

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:shared_preferences_content_provider/shared_preferences_content_provider.dart';

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  SharedPreferences? _preferences;

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

  Future<void> _initPreferences() async {
    _preferences = await SharedPreferences.getInstance();
    // 可以在这里设置一些初始值
    await _preferences!.setString('example_key', 'example_value');

    // 注册内容提供者(如果需要的话)
    // 注意:这一步通常在Android原生代码中完成,Flutter层通常不需要直接调用
    // 但为了完整性,这里展示如何在原生代码中注册内容提供者
    // 你需要在android/app/src/main/AndroidManifest.xml中添加以下内容
    /*
    <provider
        android:name=".SharedPreferencesContentProvider"
        android:authorities="${applicationId}.shared_prefs"
        android:exported="true"
        android:grantUriPermissions="true">
    </provider>
    */
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            if (_preferences != null) {
              String? value = _preferences!.getString('example_key');
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(content: Text('Value: $value')),
              );
            }
          },
          child: Text('Get Value'),
        ),
      ),
    );
  }
}

2. 在Android原生代码中注册内容提供者

打开android/app/src/main/AndroidManifest.xml文件,并添加内容提供者注册信息:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <application
        ... >
        ...
        <provider
            android:name=".SharedPreferencesContentProvider"
            android:authorities="${applicationId}.shared_prefs"
            android:exported="true"
            android:grantUriPermissions="true">
        </provider>
    </application>
</manifest>

注意:SharedPreferencesContentProvider是插件提供的类,它已经在插件的Android代码中定义好了。

3. 使用内容提供者(可选)

如果你需要从其他应用访问这些SharedPreferences数据,你需要使用内容提供者的URI。这通常涉及Android原生开发,而不是Flutter层。但在Flutter中,你可以通过插件提供的方法(如果有的话)或者通过平台通道来调用原生代码以获取URI并进行操作。

由于shared_preferences_content_provider插件的主要目的是在Android平台上通过内容提供者共享数据,而Flutter层通常不需要直接处理URI,因此这里没有具体的Flutter代码来展示如何使用内容提供者URI。

希望这个示例代码能帮助你理解如何在Flutter中使用shared_preferences_content_provider插件。如果你有更多问题或需要进一步的帮助,请随时提问!

回到顶部