Как реализовать несколько локальных уведомлений во Flutter? - PullRequest
0 голосов
/ 01 апреля 2019

Я использую пакет flutter_local_notifications для установки уведомлений.У меня есть расширяемый список, и у каждого варианта заголовка есть значок звездочки.Когда я нажимаю один из значков белых звездочек, его цвет меняется и устанавливается уведомление (метод _ showNotification).

В случае, если я нажимаю две или более звездочек, мое приложение отображает только последнее уведомление, но я хочупоказать все из них.Как я могу это сделать?

Это целый код:

import 'package:flutter/material.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';

void main() {
  runApp(new MaterialApp(home: new Home()));
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Expandable List"),
      ),
      body: new ListView.builder(
        itemBuilder: (BuildContext context, int index) {
          return new ExpandableListView(ind: index, title: broadcast[index].title);
        },
        itemCount: 2,
      ),
    );
  }
}

class ExpandableListView extends StatefulWidget {
  final String title;
  final int ind;

  const ExpandableListView({this.ind, this.title});

  @override
  _ExpandableListViewState createState() => new _ExpandableListViewState();
}

class _ExpandableListViewState extends State<ExpandableListView> {
  bool expandFlag = false;
  Color _iconColor = Colors.white;

  @override
  Widget build(BuildContext context) {
    return new Container(
      margin: new EdgeInsets.symmetric(vertical: 1.0),
      child: new Column(
        children: <Widget>[
          new Container(
            padding: new EdgeInsets.symmetric(horizontal: 5.0),
            child: new Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: <Widget>[
                new IconButton(
                    icon: new Container(
                      height: 50.0,
                      width: 50.0,
                      decoration: new BoxDecoration(
                        color: Colors.orange,
                        shape: BoxShape.circle,
                      ),
                      child: new Center(
                        child: new Icon(
                          expandFlag ? Icons.keyboard_arrow_up : Icons.keyboard_arrow_down,
                        ),
                      ),
                    ),
                    onPressed: () {
                      setState(() {
                        expandFlag = !expandFlag;
                      });
                    }),
                new Text(
                  widget.title,
                )
              ],
            ),
          ),
          new ExpandableContainer(              
              expanded: expandFlag,
              expandedHeight: 60.0 * 3,              
              child: new ListView.builder(
                itemBuilder: (BuildContext context, int index) {
                   return StatefulListTile(
                    title: broadcast[widget.ind].contents[index],
                    second: broadcast[widget.ind].time[index],
                  );
                  },
                itemCount: broadcast[widget.ind].contents.length,
              ))
        ],
      ),
    );
  }
}

class ExpandableContainer extends StatelessWidget {
  final bool expanded;
  final double expandedHeight;
  final Widget child;

  ExpandableContainer({
    @required this.child,
    this.expandedHeight,
    this.expanded = true,
  });

  @override
  Widget build(BuildContext context) {
    double screenWidth = MediaQuery.of(context).size.width;
    return new AnimatedContainer(
      duration: new Duration(milliseconds: 100),
      curve: Curves.easeInOut,
      width: screenWidth,
      height: expanded ? expandedHeight : 0.0,
      child: new Container(
        child: child,
        decoration: new BoxDecoration(border: new Border.all(width: 1.0)),
      ),
    );
  }
}

class StatefulListTile extends StatefulWidget {
  const StatefulListTile({this.title, this.second});
  final String title;
  final int second;

  @override
  _StatefulListTileState createState() => _StatefulListTileState();
}

class _StatefulListTileState extends State<StatefulListTile> {
  Color _iconColor = Colors.white;
  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin;

  @override
  initState() {
    super.initState();
    var initializationSettingsAndroid =
        new AndroidInitializationSettings('@mipmap/ic_launcher'); 
    var initializationSettingsIOS = new IOSInitializationSettings();
    var initializationSettings = new InitializationSettings(
        initializationSettingsAndroid, initializationSettingsIOS);
    flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();
    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: onSelectNotification);
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      decoration: new BoxDecoration(
          border: new Border.all(width: 1.0, color: Colors.grey),
          color: Colors.blue,),
      child: new ListTile(
        title: new Text(widget.title), 
        leading: new IconButton(
          icon: Icon(Icons.star, color: _iconColor),
          onPressed: () {
            setState(() {
              if (_iconColor == Colors.white) {
                _iconColor = Colors.yellow;
                _showNotification(widget.second);
              } else {
                _iconColor = Colors.white;
              }
            });
          },
        ),
      ),
    );
  }
  Future onSelectNotification(String payload) async {
    showDialog(
      context: context,
      builder: (_) {
        return new AlertDialog(
          title: Text("PayLoad"),
          content: Text("Payload : $payload"),
        );
      },
    );
  }

  Future _showNotification(second) async {  
    var time = new Time(10, 18, second);
    var androidPlatformChannelSpecifics =
      new AndroidNotificationDetails('show weekly channel id',
          'show weekly channel name', 'show weekly description');
    var iOSPlatformChannelSpecifics =
      new IOSNotificationDetails();
    var platformChannelSpecifics = new NotificationDetails(
        androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
    await flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime(
        0,
        widget.title,
        '', 
        Day.Monday,
        time,
        platformChannelSpecifics,
        payload: widget.title);
  }
}

class Broadcast {
  final String title;
  List<String> contents;
  List<int> time = [];

  Broadcast(this.title, this.contents, this.time);
}


 List<Broadcast> broadcast = [
  new Broadcast(
    'A',
    ['1', '2', '3'],
    [5, 10, 15],
  ),
  new Broadcast(
    'B',
    ['4', '5'],
    [20, 25],
  ),
];

1 Ответ

1 голос
/ 01 апреля 2019

Вам необходимо изменить идентификатор канала для каждого уведомления, которое вы не хотите помещать в стек.

flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime(your_channelID_goes_here, 
    widget.title,
    '', 
    Day.Monday,
    time,
    platformChannelSpecifics,
    payload: widget.title);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...