Flutter状态管理与数据持久化插件shared_preferences_riverpod的使用

Flutter状态管理与数据持久化插件shared_preferences_riverpod的使用

介绍

SharedPreferences_riverpod 插件旨在通过 Riverpod 的 Provider 更轻松地访问 SharedPreferences。这使得在Flutter应用中进行状态管理和数据持久化变得简单而高效。

使用方法

基本类型或 List<String> 类型

创建 Provider

你可以通过 createPrefProvider 和泛型参数创建一个 Provider:

final booPrefProvider = createPrefProvider<bool>(
  prefs: (_) => prefs,
  prefKey: "boolValue",
  defaultValue: false,
);

引用和更新值

  • 使用 ref.watch(provider) 引用值。
  • 使用 await ref.read(provider).update(newValue) 更新值。

示例代码如下:

Consumer(builder: (context, ref, _) {
  return CheckboxListTile(
    title: Text('checkbox'),
    value: ref.watch(booPrefProvider),
    onChanged: (v) async {
      if (v != null) await ref.read(booPrefProvider.notifier).update(v);
    },
  );
});

其他类型

对于非基本类型,你需要提供映射函数来处理序列化和反序列化:

enum EnumValues {
  foo,
  bar,
}

final enumPrefProvider = createMapPrefProvider<EnumValues>(
  prefs: (_) => prefs,
  prefKey: "enumValue",
  mapFrom: (v) => EnumValues.values.firstWhere((e) => e.toString() == v, orElse: () => EnumValues.foo),
  mapTo: (v) => v.toString(),
);

同样地,引用和更新值的方式不变:

Consumer(builder: (context, ref, _) {
  return RadioListTile(
    title: Text('value1'),
    value: EnumValues.foo,
    groupValue: ref.watch(enumPrefProvider),
    onChanged: (EnumValues? v) async {
      if (v != null) await ref.read(enumPrefProvider.notifier).update(v);
    },
  );
});

示例项目

以下是一个完整的示例项目,展示了如何结合 shared_preferencesriverpod 来管理应用的状态和持久化数据。

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:shared_preferences_riverpod/shared_preferences_riverpod.dart';

late SharedPreferences prefs;

// 定义一个布尔类型的偏好设置provider
final booPrefProvider = createPrefProvider<bool>(
  prefs: (_) => prefs,
  prefKey: "boolValue",
  defaultValue: false,
);

// 定义一个枚举类型的偏好设置provider
enum EnumValues {
  foo,
  bar,
}

final enumPrefProvider = createMapPrefProvider<EnumValues>(
  prefs: (_) => prefs,
  prefKey: "enumValue",
  mapFrom: (v) => EnumValues.values.firstWhere((e) => e.toString() == v, orElse: () => EnumValues.foo),
  mapTo: (v) => v.toString(),
);

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化SharedPreferences实例
  prefs = await SharedPreferences.getInstance();

  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Sample',
      home: Scaffold(
        appBar: AppBar(title: Text('Shared Preferences with Riverpod')),
        body: Consumer(builder: (context, ref, _) {
          return ListView(children: [
            CheckboxListTile(
              title: Text('BoolPrefNotifier ${ref.watch(booPrefProvider)}'),
              value: ref.watch(booPrefProvider),
              onChanged: (v) async {
                if (v != null) await ref.read(booPrefProvider.notifier).update(v);
              },
            ),
            RadioListTile(
              title: Text('${EnumValues.foo.toString()}'),
              value: EnumValues.foo,
              groupValue: ref.watch(enumPrefProvider),
              onChanged: (EnumValues? v) async {
                if (v != null) await ref.read(enumPrefProvider.notifier).update(v);
              },
            ),
            RadioListTile(
              title: Text('${EnumValues.bar.toString()}'),
              value: EnumValues.bar,
              groupValue: ref.watch(enumPrefProvider),
              onChanged: (EnumValues? v) async {
                if (v != null) await ref.read(enumPrefProvider.notifier).update(v);
              },
            ),
          ]);
        }),
      ),
    );
  }
}

这个例子展示了如何在一个简单的Flutter应用程序中使用 shared_preferences_riverpod 进行状态管理和数据持久化。通过这种方式,您可以轻松地将用户的选择保存到设备上,并在下次启动应用时恢复这些选择。


更多关于Flutter状态管理与数据持久化插件shared_preferences_riverpod的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter状态管理与数据持久化插件shared_preferences_riverpod的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用 shared_preferences_riverpod 进行状态管理与数据持久化的代码案例。shared_preferences_riverpod 是一个结合 Riverpod 状态管理和 SharedPreferences 数据持久化的库。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加必要的依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_riverpod: ^1.0.0
  shared_preferences: ^2.0.15
  shared_preferences_riverpod: ^0.2.0

2. 初始化 Riverpod

在你的 main.dart 文件中初始化 Riverpod:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences_riverpod/shared_preferences_riverpod.dart';

void main() {
  runApp(
    ProviderScope(
      child: MyApp(),
    ),
  );
}

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

3. 设置 SharedPreferences Riverpod

创建一个文件 shared_preferences_provider.dart,用于定义和初始化 SharedPreferences 相关的 Riverpod providers:

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences_riverpod/shared_preferences_riverpod.dart';

final sharedPreferencesProvider = sharedPreferencesRiverpodProvider(
  name: 'app_preferences',
);

final counterProvider = StateNotifierProvider<CounterNotifier, int>(
  (ref) {
    val preferences = ref.watch(sharedPreferencesProvider);
    var counter = preferences.getInt('counter') ?? 0;
    return CounterNotifier(counter, preferences);
  },
);

class CounterNotifier extends StateNotifier<int> {
  final SharedPreferences preferences;

  CounterNotifier(int state, this.preferences) : super(state);

  void increment() {
    state += 1;
    preferences.setInt('counter', state);
  }
}

4. 使用 Providers

在你的 MyHomePage 中使用这些 providers:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'shared_preferences_provider.dart';

class MyHomePage extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final counter = ref.watch(counterProvider);
    final counterNotifier = ref.read(counterProvider.notifier);

    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Demo Home Page'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counterNotifier.increment();
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

5. 运行应用

确保你已经连接了 Flutter 开发环境,然后运行应用:

flutter run

解释

  1. 依赖项:我们添加了 flutter_riverpodshared_preferencesshared_preferences_riverpod 依赖项。
  2. 初始化 Riverpod:在 main.dart 中,我们创建了 ProviderScope 包裹整个应用。
  3. 定义 Providers:在 shared_preferences_provider.dart 中,我们定义了一个 SharedPreferences 的 provider 和一个 StateNotifierProvider 来管理计数器状态。
  4. 使用 Providers:在 MyHomePage 中,我们通过 ref.watchref.read 来访问和修改计数器状态。

这样,你就成功地在 Flutter 应用中使用了 shared_preferences_riverpod 进行状态管理和数据持久化。

回到顶部