Flutter本地存储插件prefs的使用
Flutter本地存储插件prefs的使用
prefs
是一个用于在Flutter应用中存储和读取用户偏好设置的插件。它封装了 SharedPreferences
和 NSUserDefaults
,使得在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
更多关于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应用中保存和检索简单的字符串数据。以下是主要步骤:
- 在
pubspec.yaml
文件中添加shared_preferences
依赖。 - 使用
SharedPreferences.getInstance()
方法获取SharedPreferences
实例。 - 使用
setString
方法保存数据,使用getString
方法读取数据,使用remove
方法移除数据。 - 使用
setState
方法更新UI以反映存储中的数据变化。
希望这个示例对你有所帮助!