Flutter本地存储插件prefs的使用

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

Flutter本地存储插件prefs的使用

prefs 是一个用于在Flutter应用中存储和读取用户偏好设置的插件。它封装了 SharedPreferencesNSUserDefaults,使得在Android和iOS平台上实现持久化存储变得简单。

安装

首先,在你的 pubspec.yaml 文件中添加 prefs 依赖:

dependencies:
  prefs: ^3.0.0

确保你总是使用最新的主版本号(例如 ^3.0.0),这样你可以获取所有的小版本更新和补丁更新。

初始化与清理

在使用 prefs 插件之前,需要进行初始化,并在适当的时候进行清理。通常是在 State 对象的 initState()dispose() 方法中进行这些操作。

示例代码

以下是一个完整的示例,展示了如何使用 prefs 插件来存储和读取用户的偏好设置。

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

void main() => runApp(const PrefsDemoApp());

class PrefsDemoApp extends StatelessWidget {
  const PrefsDemoApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) =>
      const MaterialApp(home: SharedPreferencesDemo());
}

class SharedPreferencesDemo extends StatefulWidget {
  const SharedPreferencesDemo({Key? key}) : super(key: key);

  @override
  State<SharedPreferencesDemo> createState() => _SharedPreferencesDemoState();
}

class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
  final _formKey = GlobalKey<FormState>();

  bool get radioButton => _radioButton ??= Prefs.getBool('boolean', false);
  set radioButton(bool radio) => _radioButton = radio;
  bool? _radioButton;

  @override
  void dispose() {
    Prefs.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) => Scaffold(
        appBar: AppBar(
          title: const Text('Preferences Demo'),
        ),
        body: FutureBuilder<bool>(
            future: initPrefs(),
            builder: (_, snapshot) {
              if (snapshot.hasData) {
                if (snapshot.data != null) {
                  return form;
                } else {
                  return const Text('Failed to startup');
                }
              } else if (snapshot.hasError) {
                return Text('${snapshot.error}');
              }
              return const Center(child: CircularProgressIndicator());
            }),
      );

  Widget get form => Form(
        key: _formKey,
        child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              TextFormField(
                key: const Key('string'),
                initialValue: Prefs.getString('string'),
                onSaved: (String? newValue) =>
                    Prefs.setString('string', newValue),
                decoration: const InputDecoration(
                  labelText: 'Enter one or two words',
                ),
                keyboardType: TextInputType.text,
                inputFormatters: <TextInputFormatter>[
                  FilteringTextInputFormatter.singleLineFormatter,
                ],
              ),
              TextFormField(
                key: const Key('integer'),
                initialValue: Prefs.getInt('integer').toString(),
                onSaved: (String? newValue) {
                  if (newValue!.isNotEmpty) {
                    Prefs.setInt('integer', int.parse(newValue));
                  }
                },
                decoration: const InputDecoration(
                  labelText: 'Enter a integer',
                ),
                keyboardType: const TextInputType.numberWithOptions(),
                inputFormatters: <TextInputFormatter>[
                  FilteringTextInputFormatter.digitsOnly,
                ],
              ),
              TextFormField(
                key: const Key('double'),
                initialValue: Prefs.getDouble('double').toString(),
                onSaved: (String? newValue) {
                  if (newValue!.isNotEmpty) {
                    Prefs.setDouble('double', double.parse(newValue));
                  }
                },
                decoration: const InputDecoration(
                  labelText: 'Enter a Double number',
                ),
                keyboardType: const TextInputType.numberWithOptions(decimal: true),
              ),
              _RadioButton(this),
              Align(
                alignment: Alignment.bottomRight,
                child: Padding(
                  padding: const EdgeInsets.all(20),
                  child: ElevatedButton(
                    key: const Key('Save'),
                    onPressed: () {
                      _formKey.currentState!.save();
                      Prefs.setBool('boolean', _radioButton);
                    },
                    child: const Text('Save'),
                  ),
                ),
              ),
            ]),
      );

  Future<bool> initPrefs() async {
    await Prefs.init();
    return true;
  }
}

class _RadioButton extends StatefulWidget {
  const _RadioButton(this.state, {Key? key}) : super(key: key);
  final _SharedPreferencesDemoState state;

  @override
  State<StatefulWidget> createState() => _RadioButtonState();
}

class _RadioButtonState extends State<_RadioButton> {
  @override
  Widget build(BuildContext context) => Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Flexible(
            child: RadioListTile<bool>(
              key: const Key('true'),
              value: true,
              groupValue: widget.state.radioButton,
              onChanged: (newValue) {
                widget.state.radioButton = newValue as bool;
                setState(() {});
              },
              title: const Text('True'),
            ),
          ),
          Flexible(
            child: RadioListTile<bool>(
              key: const Key('false'),
              value: false,
              groupValue: widget.state.radioButton,
              onChanged: (newValue) {
                widget.state.radioButton = newValue as bool;
                setState(() {});
              },
              title: const Text('False'),
            ),
          ),
        ],
      );
}

主要功能

  • 初始化:通过调用 Prefs.init() 初始化插件。
  • 存储数据:使用 Prefs.setString, Prefs.setInt, Prefs.setDouble, Prefs.setBool 等方法存储不同类型的数据。
  • 读取数据:使用 Prefs.getString, Prefs.getInt, Prefs.getDouble, Prefs.getBool 等方法读取数据。
  • 清理:在不再需要时调用 Prefs.dispose() 清理资源。

结论

通过使用 prefs 插件,可以轻松地在Flutter应用中实现本地存储功能。这个插件不仅简化了存储和读取操作,还提供了丰富的API接口,方便开发者快速集成到自己的项目中。希望这个示例能够帮助你更好地理解和使用 prefs 插件。


更多关于Flutter本地存储插件prefs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地存储插件prefs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter中使用shared_preferences插件进行本地存储的示例代码。shared_preferences是一个非常流行的Flutter插件,用于在设备的本地存储中保存和检索简单的键值对数据。

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

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

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

接下来,你可以在你的Dart代码中这样使用shared_preferences

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

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

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

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

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

  @override
  void initState() {
    super.initState();
    // 初始化SharedPreferences实例
    _initPreferences();
  }

  Future<void> _initPreferences() async {
    _preferences = await SharedPreferences.getInstance();
    // 从SharedPreferences中读取数据
    setState(() {
      _savedValue = _preferences.getString('my_key');
    });
  }

  Future<void> _saveData() async {
    // 保存数据到SharedPreferences
    setState(() {
      _preferences.setString('my_key', 'Hello, SharedPreferences!');
    });
    // 刷新UI以显示新的保存值(可选,取决于你的应用逻辑)
    _initPreferences();
  }

  Future<void> _removeData() async {
    // 从SharedPreferences中移除数据
    setState(() {
      _preferences.remove('my_key');
    });
    // 刷新UI以显示移除后的值(可选,取决于你的应用逻辑)
    _initPreferences();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('SharedPreferences Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text(
              'Saved Value:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 8),
            Text(
              _savedValue ?? 'No value saved',
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 24),
            ElevatedButton(
              onPressed: _saveData,
              child: Text('Save Data'),
            ),
            SizedBox(height: 12),
            ElevatedButton(
              onPressed: _removeData,
              child: Text('Remove Data'),
            ),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何使用shared_preferences插件在Flutter应用中保存和检索简单的字符串数据。以下是主要步骤:

  1. pubspec.yaml文件中添加shared_preferences依赖。
  2. 使用SharedPreferences.getInstance()方法获取SharedPreferences实例。
  3. 使用setString方法保存数据,使用getString方法读取数据,使用remove方法移除数据。
  4. 使用setState方法更新UI以反映存储中的数据变化。

希望这个示例对你有所帮助!

回到顶部