Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用

Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用

这个包允许你像处理带有值获取器、设置器和变化流的字段一样来处理共享偏好设置。

这个包依赖于field_delegate。它是一个抽象的可变字段委托,可以用作访问不同数据源的接口。

使用

要创建一个SharedPreferencesField,你需要创建一个SharedPreferencesFieldFactory并调用一个方法,该方法具有所需类型,并传递可以通过该键从共享偏好设置请求值的键。例如SharedPreferencesFieldFactory().int('key')

final fieldFactory = SharedPreferencesFieldFactory(sharedPreferences);
Field<int?> intField = factory.int(intFieldKey);
int value = intField.get();
Future<void> result = intField.set(1);
Stream<int> changes = intField.onChanged;

SharedPreferencesField有一个泛型类型,默认情况下它是可空的,但你可以添加一个默认值使其成为非可空的Field

Field<int?> intNullableField;
Field<int> notNullableField = Field.notNullable(
  source: nullableFiled,
  defaultValue: 0,
);

你可以使用Field.map函数将Field的值映射到其他类型。

Field<int> intField;
Field<String> mappedField = Field.map<int, String>(
  source: intField,
  mapToSource: (value) => int.parse(value),
  mapFromSource: (value) => value.toString(),
);

SharedPreferencesFieldFactory有一个dispose方法,用于取消此工厂创建的字段的流。

final fieldFactory = SharedPreferencesFieldFactory(sharedPreferences);
Field<int?> intField = factory.int(intFieldKey);
//...
fieldFactory.dispose();

完整示例

以下是一个完整的示例,展示了如何使用shared_preferences_field_delegate

示例代码

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

late Field<int> counterSharedPreferencesField;

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final sharedPreferences = await SharedPreferences.getInstance();
  final fieldFactory = SharedPreferencesFieldFactory(sharedPreferences);
  counterSharedPreferencesField = Field.notNullable(
    source: fieldFactory.int('counterSharedPreferencesField'),
    defaultValue: 0,
  );
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  set _counter(int value) {
    counterSharedPreferencesField.set(value);
  }

  int get _counter => counterSharedPreferencesField.get();

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

更多关于Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据存储与字段委托插件shared_preferences_field_delegate的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,shared_preferences 是一个常用的插件,用于在本地存储简单的键值对数据。而 shared_preferences_field_delegate 是一个基于 shared_preferences 的插件,它通过字段委托的方式简化了数据的存储和读取操作。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 shared_preferencesshared_preferences_field_delegate 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: ^2.0.6
  shared_preferences_field_delegate: ^1.0.0

然后运行 flutter pub get 以安装依赖。

2. 基本使用

2.1 导入包

在你的 Dart 文件中导入所需的包:

import 'package:shared_preferences/shared_preferences.dart';
import 'package:shared_preferences_field_delegate/shared_preferences_field_delegate.dart';

2.2 创建 SharedPreferences 实例和 Field Delegate

首先,你需要获取 SharedPreferences 的实例,然后使用它来创建 SharedPreferencesFieldDelegate 实例:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final prefs = await SharedPreferences.getInstance();
  final delegate = SharedPreferencesFieldDelegate(prefs);
  
  runApp(MyApp(delegate: delegate));
}

2.3 使用 Field Delegate 存储和读取数据

你可以使用 delegate 来存储和读取数据。SharedPreferencesFieldDelegate 提供了多种类型的字段委托,例如 StringFieldDelegateIntFieldDelegateBoolFieldDelegate 等。

class MyApp extends StatelessWidget {
  final SharedPreferencesFieldDelegate delegate;

  MyApp({required this.delegate});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SharedPreferences Field Delegate Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  // 存储字符串
                  await delegate.setString('username', 'JohnDoe');
                },
                child: Text('Store Username'),
              ),
              ElevatedButton(
                onPressed: () async {
                  // 读取字符串
                  String? username = delegate.getString('username');
                  print('Username: $username');
                },
                child: Text('Read Username'),
              ),
              ElevatedButton(
                onPressed: () async {
                  // 存储布尔值
                  await delegate.setBool('isLoggedIn', true);
                },
                child: Text('Store Login Status'),
              ),
              ElevatedButton(
                onPressed: () async {
                  // 读取布尔值
                  bool? isLoggedIn = delegate.getBool('isLoggedIn');
                  print('Is Logged In: $isLoggedIn');
                },
                child: Text('Read Login Status'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

3. 高级用法

shared_preferences_field_delegate 还支持更高级的用法,比如使用 EnumFieldDelegate 来存储和读取枚举值。

enum ThemeMode { light, dark }

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final prefs = await SharedPreferences.getInstance();
  final delegate = SharedPreferencesFieldDelegate(prefs);
  
  runApp(MyApp(delegate: delegate));
}

class MyApp extends StatelessWidget {
  final SharedPreferencesFieldDelegate delegate;

  MyApp({required this.delegate});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SharedPreferences Field Delegate Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  // 存储枚举值
                  await delegate.setEnum('theme', ThemeMode.dark);
                },
                child: Text('Store Theme Mode'),
              ),
              ElevatedButton(
                onPressed: () async {
                  // 读取枚举值
                  ThemeMode? theme = delegate.getEnum('theme', ThemeMode.values);
                  print('Theme Mode: $theme');
                },
                child: Text('Read Theme Mode'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部