【发布时间】:2019-01-08 06:20:12
【问题描述】:
我必须及时发送推送通知。我有一个我的任务列表,我希望该应用程序应该使用时间和日期通知我每个任务。目前我正在使用firebase 来存储我的任务。这是我的代码..
@override
void initState() {
// TODO: implement initState
super.initState();
_dateText = "${_dueDate.day}/${_dueDate.month}/${_dueDate.year}";
_timeText = "${_time.hour}:${_time.minute}";
menuDataList = [
new MenuData(Icons.add, (context, menuData) {
Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context)=> new AddTask(email: widget.user.email)));
}
,labelText: 'Add Task'
),
new MenuData(Icons.group_add, (context, menuData) {
Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context)=> new AddGroup(email: widget.user.email)));
}
,labelText: 'Add Group'
),
new MenuData(Icons.group, (context, menuData) {
Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context)=> new CreateGroup(email: widget.user.email )));
}
,labelText: 'View Group'
),
new MenuData(Icons.search, (context, menuData) {
Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context)=> new MySearchPage()));
}
,labelText: 'Search Here'
),
];
var android = new AndroidInitializationSettings('mipmap/ic_launcher');
var ios = new IOSInitializationSettings();
var platform = new InitializationSettings(android , ios);
flutterLocalNotificationsPlugin.initialize(platform);
_firebaseMessaging.configure(
onMessage: (Map<String , dynamic> message){
showNotification(message);
print('on message $message');
// AudioCache player = new AudioCache();
// const alarmAudioPath = "sounds/notification.mp3";
// player.play(alarmAudioPath);
},
onResume: (Map<String , dynamic> message){
showNotification(message);
print('on message $message');
},
onLaunch: (Map<String , dynamic> message){
showNotification(message);
print('on message $message');
},
);
_firebaseMessaging.getToken().then((token){
print(token);
});
}
showNotification(Map<String , dynamic> message) async{
var android = new AndroidNotificationDetails('channel_id' , "CHANNAL NAME" , "channelDescription");
var ios = IOSNotificationDetails();
var platform = new NotificationDetails(android, ios);
await flutterLocalNotificationsPlugin.show(0, note , newtask , platform);
}
这是我显示任务的列表的代码。
class TaskList extends StatelessWidget{
TaskList({this.document});
final List<DocumentSnapshot> document;
@override
Widget build(BuildContext context) {
// TODO: implement build
return new ListView.builder(
itemCount: document.length,
itemBuilder: (BuildContext , int i ){
String title = document[i].data['title'].toString();
String note = document[i].data['note'].toString();
DateTime _date = document[i].data['duedate'];
String duedate = "${_date.day}/${_date.month}/${_date.year}";
// String email = document[i].data['email'].toString();
return new Dismissible(
key: new Key(document[i].documentID),
onDismissed: (direction){
Firestore.instance.runTransaction((transaction) async{
DocumentSnapshot snapshot= await transaction.get(document[i].reference);
await transaction.delete(snapshot.reference);
});
Scaffold.of(context).showSnackBar(new SnackBar(content: new Text("Data Deleted"),));
},
child: Padding(
padding: const EdgeInsets.only(left: 0.0, top: 0.0 ,right: 0.0 , bottom: 16.0 ),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: new Align( alignment: Alignment.topLeft ,
child: new IconButton(icon: Icon(Icons.lens , color: Colors.black87, size: 12.0,), onPressed: (
){
},
),
),
),
new Expanded(
child: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(bottom: 0.0),
child: Text(title , style: new TextStyle(fontSize: 16.0 , letterSpacing: 1.0),),
),
new Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 16.0 , top: 3.0 , bottom: 3.0),
child: Icon(Icons.date_range , color: Colors.black54, size: 17.0),
),
new Expanded(child: Text(duedate , style: new TextStyle(fontSize: 13.0 ),)),
],
),
new Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 16.0),
child: Icon(Icons.note , color: Colors.black54, size: 17.0,),
),
new Expanded(child: Text(note , style: new TextStyle(fontSize: 13.0 ),)),
],
),
Padding(
padding: const EdgeInsets.only(top: 15.0),
),
],
),
),
),
Padding(
padding: const EdgeInsets.only(bottom: 10.0),
child: new IconButton(icon: Icon(Icons.edit , color: Colors.black54,), onPressed: (
){
Navigator.of(context).push(new MaterialPageRoute(builder: (context)=> new EditTask(
title: title,
note: note,
duedate: document[i].data['duedate'],
index:document[i].reference,
)));
},
),
)
],
),
),
);
},
);
}
}
【问题讨论】:
-
移动开发存在不同类型的通知。具体来说,您可以有远程和本地通知。您要求及时(我猜是预定的)push 通知(有点远程通知)。因此,根据您的要求,这是要添加到您的服务器而不是您的客户端应用程序的业务逻辑。相反,如果您想使用本地通知,我建议您使用 that 之类的插件,并根据您的任务日期和时间安排本地通知。
-
让我知道您的需求:本地还是远程?
-
@shadowsheep 我想要远程通知,就像我设置的每个任务或为他自己的应用程序设置的任何用户都应该在该特定任务时间发送通知
-
我建议为此安排本地通知,因为您的设备上已经有您的任务及其日期。本地通知不需要网络连接,您也不需要花费资源来发送远程通知。顺便说一句,如果您想在服务器端发送远程通知,您必须根据任务调度安排一个调用FCM api rest 到设备令牌的 cron 作业。如果您使用的是 Firebase 云功能,则必须遵循 Sam asnwer,因为您现在无法设置 cron 作业云功能。