颤动本地通知发送带有有效负载选项的 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的主要内容,如果未能解决你的问题,请参考以下文章