【问题标题】:How to show dialog box without context in flutter如何在颤动中显示没有上下文的对话框
【发布时间】:2020-08-22 17:47:18
【问题描述】:

我正在尝试使用 Firebase 云评估,在此过程中,我只想在推送通知到达时向用户显示一个弹出对话框。但是为了显示对话,我们需要你的上下文对象,因为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;
        });

注意:这段代码写在一个单独的类中,我试图在没有任何第三部分库的情况下实现它。

【问题讨论】:

    标签: flutter firebase-cloud-messaging flutter-dialog


    【解决方案1】:

    首先,您不能在没有有效上下文的情况下显示对话框。 你为什么不像这样简单地将BuildContext 传递给你的班级?

    class SeparateClass {
      final BuildContext context;
    
      SeparateClass(this.context);
    
      void configure() {
        // your rest of the configuration code
        // you can use showDialog(context, ...) here
      }
    }
    

    【讨论】:

    • 我也试过了,它不适合我。我通过传递 BuildContext 对象从 main.dart 的 build 方法中调用了 NotificationManager 的这个配置方法。不过,它没有显示弹出窗口。
    • @DKAnsh 请发布您的完整代码,如果可重现,我可以进一步帮助您。
    【解决方案2】:

    我解决了一个类似的问题,它显示一个 SnackBar 而不是一个对话框。使用此代码,您可以在应用程序中的任何位置启动 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...");
      }
    }
    

    也许你可以将它应用到你的代码中。

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 2021-11-06
      • 2022-01-19
      • 1970-01-01
      • 2019-09-06
      • 2022-11-11
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多