Flutter本地数据存储插件locally的使用

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

Flutter本地数据存储插件locally的使用

插件介绍

locally 是一个用于在Flutter应用中创建本地通知的插件,它依赖于 flutter_local_notification 插件,并试图使使用更加简单和用户友好。该插件支持Android和iOS平台。

安装与配置

安装插件后,需要进行以下配置:

Android配置
  1. 如果你的应用需要调度通知,则需要请求权限以在手机启动时接收通知。
  2. AndroidManifest.xml 文件中添加以下权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  1. 添加以下广播接收器确保通知在重启后仍然保持调度状态:
&lt;receiver android:name="com.dexterous.flutterlocalnotifications.ScheduledNotificationBootReceiver"&gt;
    &lt;intent-filter&gt;
        &lt;action android:name="android.intent.action.BOOT_COMPLETED"&gt;&lt;/action&gt;
    &lt;/intent-filter&gt;
&lt;/receiver&gt;
  1. 如果需要自定义Android通知的振动模式,请添加以下权限:
&lt;uses-permission android:name="android.permission.VIBRATE" /&gt;

示例代码如下:

import 'package:example/second_screen.dart';
import 'package:flutter/material.dart';
import 'package:locally/locally.dart';

void main() =&gt; 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() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {

  var _formKey = GlobalKey&lt;FormState&gt;();
  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) =&gt; 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: &lt;Widget&gt;[

              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集成
  1. AppDelegate.m/AppDelegate.swift 文件中添加以下代码:

    • Objective-C:
      if (@available(iOS 10.0, *)) {
        [UNUserNotificationCenter currentNotificationCenter].delegate = (id&lt;UNUserNotificationCenterDelegate&gt;) self;
      }
      
    • Swift:
      if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
      }
      
  2. 对于iOS 10+版本,使用 presentation options 控制行为;对于较旧的iOS版本,需要在创建 IOSInitializationSettings 对象时处理回调。

示例代码如下:

import 'package:example/second_screen.dart';
import 'package:flutter/material.dart';
import 'package:locally/locally.dart';

void main() =&gt; 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() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {

  var _formKey = GlobalKey&lt;FormState&gt;();
  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) =&gt; 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: &lt;Widget&gt;[

              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

1 回复

更多关于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'),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 依赖添加:在pubspec.yaml文件中添加了locally依赖。
  2. 初始化:在_LocallyExampleStateinitState方法中,尝试从本地存储中检索数据。
  3. 数据检索:定义了一个_retrieveData方法,使用_locally.getString('myKey')来检索键为'myKey'的字符串值。
  4. 数据存储:定义了一个_storeData方法,使用_locally.setString('myKey', newValue)来存储一个新的字符串值。
  5. UI展示:在UI中显示检索到的值,并提供一个按钮来存储新的数据。

这个示例展示了如何使用locally插件进行基本的键值对存储和检索。你可以根据需要扩展这个示例,以处理更多类型的数据或更复杂的存储需求。

回到顶部