Приложение Flutter, которое использует Workmanager, чтобы показать красное оверлейное окно для предупреждения о новостяхAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Приложение Flutter, которое использует Workmanager, чтобы показать красное оверлейное окно для предупреждения о новостях

Сообщение Anonymous »

У меня есть приложение Flutter, в котором используется Workmanager, чтобы показать красное окно наложения для разбивших новостей через Flutter_overlay_window. Оверловое появляется правильно и воспроизводит звук, но он остается видимым на неопределенный срок, а не исчезает через 10 секунд, как запрограммировано в Workmanager.dart < /p>
Несмотря на то, что код запускается (подтверждается с помощью Debugprint), оверлей остается видимым даже после закрытия приложения или перезагрузки, и только закрывает кнопку «Br />». перезагружен.
Пожалуйста, предложите исправления или модификации кода, чтобы убедиться, что наложение автоматически закрывается даже на фоне < /p>
Мой манифест: < /p>




























< /code>

breaking_news_overlay.dart: < /p>
class BreakingNewsOverlay extends StatefulWidget {
child: Text(
'Breaking News',
style: TextStyle(
color: Colors.white,
fontSize: 22,
fontWeight: FontWeight.bold,
),
),
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 12),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Text(
title,
style: const TextStyle(
color: Colors.white,
fontSize: 16,
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.right,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
const SizedBox(height: 4),
Text(
'more',
style: TextStyle(
color: Colors.white.withOpacity(0.8),
fontSize: 14,
),
),
],
),
),
),
IconButton(
icon: const Icon(Icons.close, color: Colors.white),
onPressed: () => FlutterOverlayWindow.closeOverlay(),
),
],
),
);
}

@override
void dispose() {
FlutterOverlayWindow.overlayListener.drain();
super.dispose();
}
}
< /code>
workmanager.dart: < /p>
const String breakingNewsTask = "checkBreakingNewsTask";

class AppStateObserver with WidgetsBindingObserver {
static bool isAppForeground = true;

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
isAppForeground = state == AppLifecycleState.resumed;
}
}

void setupAppStateObserver() {
final appStateObserver = AppStateObserver();
WidgetsBinding.instance.addObserver(appStateObserver);
}

void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
if (task == breakingNewsTask) {
try {

final DatabaseReference newsRef =
FirebaseDatabase.instance.ref().child('BreakingNews');
final snapshot = await newsRef.limitToLast(1).get();

if (snapshot.exists) {
final data = snapshot.children.first.value as Map?;
final title = data?['BkgNewsTitle'] ?? '';
final date = data?['date'];

final isGranted = await FlutterOverlayWindow.isPermissionGranted();
if (!isGranted) {
log('Overlay permission not granted. Cannot show overlay.');
return Future.value(true);
}

debugPrint('flutter:');
await FlutterOverlayWindow.showOverlay(
height: 130,
width: WindowSize.matchParent,
alignment: OverlayAlignment.bottomCenter,
enableDrag: false,
overlayTitle: "BreakingNewsOverlay",
flag: OverlayFlag.defaultFlag,
);

final audioPlayer = AudioPlayer();
await audioPlayer.play(AssetSource('mp3/news-broadcast.mp3'));

debugPrint('flutter: ');
final completer = Completer();
Timer(const Duration(seconds: 10), () {
debugPrint('flutter: ');
completer.complete();
});
await completer.future;

if (AppStateObserver.isAppForeground) {
debugPrint('flutter: ###');
await FlutterOverlayWindow.closeOverlay();
debugPrint('flutter: done');
} else {
debugPrint('flutter: error');
}
}
} catch (e) {
log('Error in breaking news task: $e');
}
}
return Future.value(true);
});
}
Future initializeWorkManager() async {
setupAppStateObserver();

await Workmanager().initialize(
callbackDispatcher,
isInDebugMode: false,
);
);
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... aking-news
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»