Flutter本地数据存储插件locally的使用
Flutter本地数据存储插件locally的使用
插件介绍
locally
是一个用于在Flutter应用中创建本地通知的插件,它依赖于 flutter_local_notification
插件,并试图使使用更加简单和用户友好。该插件支持Android和iOS平台。
安装与配置
安装插件后,需要进行以下配置:
Android配置
- 如果你的应用需要调度通知,则需要请求权限以在手机启动时接收通知。
- 在
AndroidManifest.xml
文件中添加以下权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
- 添加以下广播接收器确保通知在重启后仍然保持调度状态:
<receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
- 如果需要自定义Android通知的振动模式,请添加以下权限:
<uses-permission android:name="android.permission.VIBRATE" />
示例代码如下:
import 'package:example/second_screen.dart';
import 'package:flutter/material.dart';
import 'package:locally/locally.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Locally Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Locally Example'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var _formKey = GlobalKey<FormState>();
TextEditingController title = TextEditingController();
TextEditingController message = TextEditingController();
@override
void initState() {
// TODO: implement initState
super.initState();
}
showMessage() {
if(_formKey.currentState.validate()) {
_formKey.currentState.save();
Locally locally;
locally = Locally(
context: context,
payload: 'test',
pageRoute: MaterialPageRoute(builder: (context) => SecondScreen(title: title.text, message: message.text)),
appIcon: 'mipmap/ic_launcher',
);
locally.show(title: title.text, message: message.text);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
showMessage();
},
),
body: Center(
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
margin: EdgeInsets.all(20),
child: TextFormField(
controller: title,
validator: (v){
return v.isEmpty ? 'Enter title' : null;
},
decoration: InputDecoration(
hintText: 'Title',
labelText: 'Title'
),
),
),
Container(
margin: EdgeInsets.all(20),
child: TextFormField(
controller: message,
validator: (v){
return v.isEmpty ? 'Enter message body' : null;
},
decoration: InputDecoration(
hintText: 'Message',
labelText: 'Message'
),
),
),
],
),
),
),
);
}
}
iOS集成
-
在
AppDelegate.m/AppDelegate.swift
文件中添加以下代码:- Objective-C:
if (@available(iOS 10.0, *)) { [UNUserNotificationCenter currentNotificationCenter].delegate = (id<UNUserNotificationCenterDelegate>) self; }
- Swift:
if #available(iOS 10.0, *) { UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate }
- Objective-C:
-
对于iOS 10+版本,使用
presentation options
控制行为;对于较旧的iOS版本,需要在创建IOSInitializationSettings
对象时处理回调。
示例代码如下:
import 'package:example/second_screen.dart';
import 'package:flutter/material.dart';
import 'package:locally/locally.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Locally Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Locally Example'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
var _formKey = GlobalKey<FormState>();
TextEditingController title = TextEditingController();
TextEditingController message = TextEditingController();
@override
void initState() {
// TODO: implement initState
super.initState();
}
showMessage() {
if(_formKey.currentState.validate()) {
_formKey.currentState.save();
Locally locally;
locally = Locally(
context: context,
payload: 'test',
pageRoute: MaterialPageRoute(builder: (context) => SecondScreen(title: title.text, message: message.text)),
appIcon: 'mipmap/ic_launcher',
);
locally.show(title: title.text, message: message.text);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
showMessage();
},
),
body: Center(
child: Form(
key: _formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
margin: EdgeInsets.all(20),
child: TextFormField(
controller: title,
validator: (v){
return v.isEmpty ? 'Enter title' : null;
},
decoration: InputDecoration(
hintText: 'Title',
labelText: 'Title'
),
),
),
Container(
margin: EdgeInsets.all(20),
child: TextFormField(
controller: message,
validator: (v){
return v.isEmpty ? 'Enter message body' : null;
},
decoration: InputDecoration(
hintText: 'Message',
labelText: 'Message'
),
),
),
],
),
),
),
);
}
}
示例代码
以下是完整的示例代码,展示了如何使用 locally
插件创建本地通知:
更多关于Flutter本地数据存储插件locally的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地数据存储插件locally的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,关于在Flutter中使用locally
插件进行本地数据存储,下面是一个简单的代码示例,展示如何使用该插件来存储和检索数据。
首先,确保你已经在pubspec.yaml
文件中添加了locally
依赖:
dependencies:
flutter:
sdk: flutter
locally: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中使用locally
插件。以下是一个基本的示例,展示如何存储和检索一个简单的键值对数据。
import 'package:flutter/material.dart';
import 'package:locally/locally.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Locally Example'),
),
body: LocallyExample(),
),
);
}
}
class LocallyExample extends StatefulWidget {
@override
_LocallyExampleState createState() => _LocallyExampleState();
}
class _LocallyExampleState extends State<LocallyExample> {
final Locally _locally = Locally();
String? _retrievedValue;
@override
void initState() {
super.initState();
// 尝试从本地存储中检索数据
_retrieveData();
}
Future<void> _retrieveData() async {
String? value = await _locally.getString('myKey');
setState(() {
_retrievedValue = value ?? 'No data found';
});
}
Future<void> _storeData() async {
String newValue = 'Hello, Locally!';
await _locally.setString('myKey', newValue);
// 更新UI以显示新存储的数据(可选)
setState(() {
_retrievedValue = newValue;
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Retrieved Value:',
style: TextStyle(fontSize: 20),
),
Text(
_retrievedValue ?? '',
style: TextStyle(fontSize: 24, color: Colors.blue),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: _storeData,
child: Text('Store Data'),
),
],
),
);
}
}
在这个示例中,我们做了以下几件事:
- 依赖添加:在
pubspec.yaml
文件中添加了locally
依赖。 - 初始化:在
_LocallyExampleState
的initState
方法中,尝试从本地存储中检索数据。 - 数据检索:定义了一个
_retrieveData
方法,使用_locally.getString('myKey')
来检索键为'myKey'
的字符串值。 - 数据存储:定义了一个
_storeData
方法,使用_locally.setString('myKey', newValue)
来存储一个新的字符串值。 - UI展示:在UI中显示检索到的值,并提供一个按钮来存储新的数据。
这个示例展示了如何使用locally
插件进行基本的键值对存储和检索。你可以根据需要扩展这个示例,以处理更多类型的数据或更复杂的存储需求。