невозможно отправлять сообщения из SendPort в ReceivePort в трепете - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь отправить сообщение через IsolateNameServer во флаттере.

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

Где я ошибаюсь? [Я внимательно слежу за этой документацией ]

Вот мой main.dart, основанный на приведенном выше do c:

import 'dart:isolate';
import 'dart:math';
import 'dart:ui';
import 'package:android_alarm_manager/android_alarm_manager.dart';
import 'package:flutter/material.dart';

final ReceivePort port = ReceivePort();
const String isolateName = 'isolate';

main() async {
  WidgetsFlutterBinding.ensureInitialized();

  IsolateNameServer.registerPortWithName(
    port.sendPort,
    isolateName,
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
            primarySwatch: Colors.blue,
            accentColor: Colors.pink,
            floatingActionButtonTheme:
                FloatingActionButtonThemeData(backgroundColor: Colors.pink)),
        home: AlarmManagerExample());
  }
}

class AlarmManagerExample extends StatefulWidget {
  @override
  _AlarmManagerExampleState createState() => _AlarmManagerExampleState();
}

class _AlarmManagerExampleState extends State<AlarmManagerExample> {
  @override
  void initState() {
    super.initState();
    AndroidAlarmManager.initialize();
    port.listen((_) async => await workForMe());
  }

  workForMe() async {
    print("Secondary Function Triggered!");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Container(
        child: RaisedButton(
          onPressed: () async {
            await AndroidAlarmManager.oneShot(const Duration(seconds: 5),
                Random().nextInt(pow(2, 21)), callback);
          },
          child: Text(
            "Alarm Manager",
          ),
        ),
      ),
    );
  }

  static SendPort uiSendPort;

  static callback() {
    print("Callbacks Triggered!");

    // This will be null if we're running in the background.
    uiSendPort ??= IsolateNameServer.lookupPortByName(isolateName);
    uiSendPort?.send(null);
  }
}

Результат, который я получаю это:

Callbacks Triggered!

Однако ожидаемый результат:

Callbacks Triggered!
Secondary Function Triggered!

1 Ответ

0 голосов
/ 03 августа 2020

Я действительно считаю, что ошибка вызвана тем, что функция workForMe () не является статической c. Более того, я не знаю, поддерживают ли callBacks Future или asyn c.

С учетом сказанного, попробуйте это, поскольку нет необходимости делать его asyn c.

 static void workForMe() {
   print("Secondary Function Triggered!");
 }
...