Как показать диалоговое окно без контекста во флаттере - PullRequest
1 голос
/ 07 мая 2020

Я пытался использовать облачную оценку firebase, и в процессе я хочу просто показать пользователю всплывающий диалог по прибытии уведомления pu sh. Но чтобы показать диалог, нам нужен объект контекста, так как один из аргументов showDialog - BuildContext.

Я пробовал много подходов, но это не сработало. На данный момент мой код выглядит следующим образом:

_firebaseMessaging.configure(
        onMessage: (Map<String, dynamic> message) {
          print('onMessage: $message');
          return;
        },
        onBackgroundMessage: myBackgroundMessageHandler,
        onResume: (Map<String, dynamic> message) {
          print('onResume: $message');
          return;
        },
        onLaunch: (Map<String, dynamic> message) {
          print('onLaunch: $message');
            Text('onLaunch: $message'),
          );
          return;
        });

Примечание: Этот код написан в отдельном классе, и я пытаюсь достичь его без какой-либо третьей библиотеки.

Ответы [ 2 ]

0 голосов
/ 01 июля 2020

Я решил аналогичную проблему, которая показывает SnackBar вместо Dialog. С помощью этого кода вы можете запускать SnackBar или Dialog в любом месте вашего приложения.

import 'package:collectio/pages/init_screen_page.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'helper.dart';

void main() {
  Provider.debugCheckInvalidValueType = null;
  runApp(App());
}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
      // here the context refers to MaterialApp widget,
      // you can´t call Scaffold.of(context)
        body: Builder(builder: (context) {
          // here the context refers to Scaffold widget
          Helper.startFirebaseMessaging(context);
          return InitScreenPage();
        }),
    ));
  }
}

class Helper {
  static startFirebaseMessaging(BuildContext buildContext) {
    final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
        var notification = message['notification'];

        // build the snackbar
        final snackBar = SnackBar(
          content: Text(notification['title']),
          action: SnackBarAction(
              label: 'Ok',
              onPressed: (){}
          ),
        );

        try {
          Scaffold.of(buildContext).showSnackBar(snackBar);
        } catch (e) {
          print(e);
        }
      },
      onLaunch: (Map<String, dynamic> message) async {
        print("onLaunch: $message");
      },
      onResume: (Map<String, dynamic> message) async {
        print("onResume: $message");
      },
    );
    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(
            sound: true, badge: true, alert: true, provisional: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {
      print("Settings registered: $settings");
    });
    _firebaseMessaging.getToken().then((String token) {
      assert(token != null);
      print("Push Messaging token: $token");;
    });
    print("Waiting for token...");
  }
}

Возможно, вы сможете применить это к своему коду.

0 голосов
/ 07 мая 2020

Во-первых, вы не можете показать диалог без действительного контекста. Почему бы вам просто не передать BuildContext своему классу вот так?

class SeparateClass {
  final BuildContext context;

  SeparateClass(this.context);

  void configure() {
    // your rest of the configuration code
    // you can use showDialog(context, ...) here
  }
}
...