颤动本地通知发送带有有效负载选项的 ID

Posted

技术标签:

【中文标题】颤动本地通知发送带有有效负载选项的 ID【英文标题】:flutter local notifications send ID with payload option 【发布时间】:2020-01-12 01:06:38 【问题描述】:

我有一个使用 sqflite 存储数据的应用程序。我使用构造函数方法从详细信息页面访问使用 listview 列出的记录。简明扼要的代码如下。

notes.dart --> 主页

 child: ListView.builder(
                            itemCount: notes.length,
                            itemBuilder: (context, index) 
                              return NoteClass(
                                  notes: notes[index],
                                  );
                            ,
                          ),

note_class.dart -->

  return Column(
      children: <Widget>[
        Dismissible(
            key: UniqueKey(),
            movementDuration: Duration(milliseconds: 400),
            background: Container(
              child: Padding(
                padding: EdgeInsets.only(left: 38),
                child: Align(
                  alignment: Alignment.centerLeft,
                  child: Icon(
                    LineIcons.trash,
                    color: Colors.red.shade900,
                    size: 27,
                  ),
                ),
              ),
            ),
            onDismissed: (direction) 
              _deleteNote(widget.notes.noteID);
            ,
            child: Card(
              margin: EdgeInsets.only(top: 2, bottom: 2),
              elevation: 2,
              shape: RoundedRectangleBorder(),
              child: Container(
                height: 80,
                child: ListTile(
                  onTap: ()
                    _detailPage(context, widget.notes);
                  ,
                  contentPadding: EdgeInsets.only(left: 10, right: 5),
                  title: Stack(
                    children: <Widget>[
                      Container(
                        padding: EdgeInsets.only(top: 17),
                        child: Icon(Icons.note)
                      ),
                      Container(
                        padding: EdgeInsets.only(left: 45),
                        child: Row(
                          mainAxisAlignment:
                          MainAxisAlignment.spaceBetween,
                          children: <Widget>[
                            Column(
                              mainAxisAlignment:
                              MainAxisAlignment.spaceBetween,
                              crossAxisAlignment:
                              CrossAxisAlignment.start,
                              children: <Widget>[
                                Container(
                                    padding: EdgeInsets.only(top: 0),
                                    child: Text(
                                      widget.notes.noteHeader,
                                      style: TextStyle(
                                          fontSize: 19,
                                          color: Colors.grey[900]),
                                    )),
                                Container(
                                  padding: EdgeInsets.only(top: 0),
                                  child: Text(
                                     widget.notes.noteBody,
                                    style:  TextStyle(
                                        fontSize: 17,
                                        color: Colors.grey[900]),
                                  ),
                                ),
                              ],
                            ),
                          ],
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            )),
      ],
    );



_detailPage(BuildContext context, NoteModel noteModel) 
    Navigator.push(
        context,
        PageTransition(
            type: PageTransitionType.rightToLeft,
            child: NoteDetail(
              content: noteModel,
            )));
  

note_detail.dart

Column(
                      mainAxisAlignment: MainAxisAlignment.start,
                      children: <Widget>[
                        Card(
                          elevation: 3,
                          shape: RoundedRectangleBorder(),
                          child: Container(
                            alignment: Alignment.centerLeft,
                            height: 50,
                            width: MediaQuery.of(context).size.width,
                            padding: EdgeInsets.only(left: 8, top: 0),
                            child: SelectableText(
                              widget.content.noteHeader,
                              style: TextStyle(fontSize: 18, color: Colors.grey[800],),
                            ),
                          ),
                        ),
                        Card(
                          elevation: 3,
                          shape: RoundedRectangleBorder(),
                          child: Container(
                            alignment: Alignment.centerLeft,
                            height: 50,
                            width: MediaQuery.of(context).size.width,
                            padding: EdgeInsets.only(left: 8, top: 0),
                            child: SelectableText(
                              widget.content.noteBody,
                              style: TextStyle(fontSize: 18, color: Colors.grey[800],),
                            ),
                          ),
                        ),],
                    ),

在笔记详细信息页面上,我使用 flutterLocalNotificationsPlugin.schedule 设置通知,我可以通过通知查看笔记详细信息。但是当我点击通知时,我想转到相关注释的详细信息页面。我用有效载荷参数发送了记录的 ID。


然后,我在 notes.dart 中添加了 onSelectNotification 方法。

Future onSelectNotification(String payload) async 
    if (payload != null) 

######## what should I write here? ########

    
  

有效载荷中有一个 ID 值。如何访问有关 ID 信息的注释详细信息。或者点击通知我可以进入笔记详情页面。

【问题讨论】:

【参考方案1】:

你快到了。您所要做的就是类似于以下内容:

class NoteDetail extends StatefulWidget 
  final String payload;
  NoteDetail (this.payload);

  @override
  State<StatefulWidget> createState() => NoteDetailState(payload);


class NoteDetailState extends State 
 String payload;
 NoteDetailState (this.payload);

 @override
 Widget build(BuildContext context) 
 return Scaffold(
  appBar: AppBar()
  body:Column( your column code here))
  
// call this after something
void save() 
  //dosomething
  // go back to the old page 
  // notice the true, if all goes good with save send true otherwise false
  Navigator.pop(context, true);
 


// use this code to go to detail
void navigateToDetail(String payload) async 
bool result = await Navigator.push(context, 
    MaterialPageRoute(builder: (context) => NoteDetail(payload)),
);
if (result == true) 
  getData(); // refresh data from db
 

【讨论】:

payload 变量的值是多少?所有笔记列表元素? 您可以发送两种方式,想想 2 个 sql 表 note 和 noteetail 让我们说它的一对多关系,即一个便笺可以有很多详细信息,因此您将所有详细信息发送到您的详细信息页面或您可以发送noteId,它是notedetail表中的主键,我知道我给出了更广泛的例子。我会使用方法 2 发送密钥,因此在您的情况下,有效负载将是一些唯一标识符 noteid

以上是关于颤动本地通知发送带有有效负载选项的 ID的主要内容,如果未能解决你的问题,请参考以下文章

本地通知颤动

本地化通知负载

颤动本地通知“一天中的小时,以 24 小时制 [0..23] 表示。”

由GPS位置触发的颤动本地通知

如何本地化 Firebase 云消息通知?

在本地通知上发送带有自定义声音的触觉