Как сделать так, чтобы цикл продолжался вне пользовательского интерфейса во флаттере? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть цикл for, который устанавливает уведомление каждую минуту каждого часа дня,

Код:

Future _showCollectionNotifications(int times, bool isHourly) async {
    var groupKey = 'com.ofo.app.collection';
    var android = AndroidNotificationDetails(
      'Id',
      'Name',
      'Description',
      groupKey: groupKey,
      setAsGroupSummary: true,
      channelShowBadge: true,
    );
    var iOS = IOSNotificationDetails();
    var details = NotificationDetails(android, iOS);
    String title = 'Collection';
    if (isHourly) {
      for (int id = 0; id < 24; id += times) {
        Time time = Time(id, 0, 0);
        String body = collectionLists[7].Collections[_getRandomCollection()];
        await randomNotification.showDailyAtTime(
            id, title, body, time, details);
      }
    } else {
      for (int id = 0; id < 24; id++) {
        for (int i = 0; i < 60; i += times) {
          Time time = Time(id, i, 0);
          String body = collectionLists[7].collections[_getRandomCollection()];
          await randomNotification.showDailyAtTime(
              id, title, body, time, details);
        }
      }
    }
  }

Проблема в том, что приложение зависает, поэтому еслиможет каким-то образом запустить код в фоновом режиме или за пределами пользовательского интерфейса, тогда это поможет решить проблему.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Поскольку вы посылаете уведомления через регулярные промежутки времени, вы можете использовать Stream.periodic для их генерации.

Я прилагаю пример, который вы можете использовать для вашего метода showCollectionNotifications() (я использую секунды впоток, чтобы проверить его легче).

Вы можете настроить класс Notification, чтобы включить все, что вам нужно.

import 'dart:async';

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {
  MyApp({Key key, this.title}) : super(key: key);

  final String title;

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

class _MyAppState extends State<MyApp> {
  String message = "";

  Stream<Notification> stream;

  @override
  void initState() {
    super.initState();
    _showCollectionNotifications(10, true);

    stream.listen((notification) {
      setState(() {
        message = "Notification ${notification.id} received";
      });
    });
  }

  void _showCollectionNotifications(int times, bool isHourly) {
    if (isHourly) {
      stream = Stream.periodic(Duration(seconds: 1), (index) {
        return Notification(index);
      }).take(times);
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: message.isEmpty ? new Container() : Text(message),
        ),
      ),
    );
  }
}

class Notification {
  int id;

  Notification(this.id);
}
0 голосов
/ 09 октября 2018

в этом случае вам следует попробовать flutter_local_notifications , который предоставит вам:

  • Запланировать еженедельное отображение уведомления в указанный день и время
  • Расписание уведомления, которое будет отображаться ежедневно в указанное время

пример из документов: показ уведомления каждую минуту

// Show a notification every minute with the first appearance happening a minute after invoking the method
var androidPlatformChannelSpecifics =
    new AndroidNotificationDetails('repeating channel id',
        'repeating channel name', 'repeating description');
var iOSPlatformChannelSpecifics =
    new IOSNotificationDetails();
var platformChannelSpecifics = new NotificationDetails(
    androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await flutterLocalNotificationsPlugin.periodicallyShow(0, 'repeating title',
    'repeating body', RepeatInterval.EveryMinute, platformChannelSpecifics);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...