Как показать диалоговое окно без контекста во флаттере
Я пытался использовать облачную оценку firebase, и в процессе я хочу просто показать пользователю всплывающее диалоговое окно по прибытии push-уведомления. Но чтобы показать диалог, нам нужен объект контекста как один из аргументов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 ответа
Во-первых, вы не можете показать диалог без действительного контекста. Почему бы тебе просто не пройтиBuildContext
в ваш класс вот так?
class SeparateClass {
final BuildContext context;
SeparateClass(this.context);
void configure() {
// your rest of the configuration code
// you can use showDialog(context, ...) here
}
}
Я решил аналогичную проблему, которая показывает 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...");
}
}
Возможно, вы сможете применить это к своему коду.