Для того, чтобы секундомер в приложении на Flutter продолжал работать и в фоновом режиме, вам понадобится использовать пакет flutter_isolate.
1. Добавьте зависимость flutter_isolate в файл pubspec.yaml вашего проекта:
dependencies: flutter_isolate: ^3.0.0
2. Импортируйте необходимые пакеты:
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_isolate/flutter_isolate.dart'; import 'package:flutter_isolate/isolate_runner.dart';
3. Создайте класс для управления изолятом, в котором будет выполняться логика секундомера:
class StopwatchManager { Stopwatch _stopwatch = Stopwatch(); Future<void> start() async { _stopwatch.start(); while (_stopwatch.isRunning) { // Логика вашего секундомера print('Elapsed time: ${_stopwatch.elapsed}'); await Future.delayed(Duration(seconds: 1)); } } }
4. В классе вашего виджета, где находится секундомер, создайте экземпляр класса StopwatchManager и FlutterIsolate.
class MyWidget extends StatefulWidget { @override _MyWidgetState createState() => _MyWidgetState(); } class _MyWidgetState extends State<MyWidget> { FlutterIsolate _isolate; StopwatchManager _stopwatchManager = StopwatchManager(); @override void initState() { super.initState(); _startIsolate(); } @override void dispose() { super.dispose(); _stopIsolate(); } Future<void> _startIsolate() async { final ReceivePort receivePort = ReceivePort(); _isolate = await FlutterIsolate.spawn( _isolateEntry, receivePort.sendPort, ); _isolate.addErrorListener(StreamController<dynamic>().add); receivePort.listen((dynamic data) { print('Isolate data: $data'); }); } void _stopIsolate() { _isolate?.kill(priority: Isolate.immediate); _isolate = null; } static void _isolateEntry(SendPort sendPort) async { final StopwatchManager stopwatchManager = StopwatchManager(); final ReceivePort receivePort = ReceivePort(); sendPort.send(receivePort.sendPort); stopWatchFromIsolate(receivePort, stopwatchManager); } static void stopWatchFromIsolate(ReceivePort receivePort, StopwatchManager stopwatchManager) async { Stopwatch stopwatch = Stopwatch(); receivePort.listen((dynamic message) async { try { stopwatchManager.start(); } catch (e) { print('Error: $e'); } }); receivePort.close(); } void _startStopwatchFromIsolate() { _isolate?.send('start'); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('My Stopwatch'), ), body: Center( child: RaisedButton( child: Text('Start Stopwatch'), onPressed: () { _startStopwatchFromIsolate(); }, ), ), ); } }
5. В данном примере, при нажатии кнопки 'Start Stopwatch', вызывается метод _startStopwatchFromIsolate()
. Этот метод отправляет сообщение в изолят с командой 'start', которое запускает секундомер. В результате в консоли виджета будет выводиться информация о прошедшем времени каждую секунду.
Elapsed time: 0:00:01.000000 Elapsed time: 0:00:02.000000 Elapsed time: 0:00:03.000000 ...
Теперь ваш секундомер будет продолжать работу, даже когда приложение переключено на другой экран.