gpt4 book ai didi

Flutter => showDialog/AlertDialog => 未找到 MaterialLocalizations

转载 作者:IT老高 更新时间:2023-10-28 12:34:27 25 4
gpt4 key购买 nike

刚接触 Flutter,但印象非常深刻。如果 PushNotification 通过 Firebase“onMessage”到达,我想显示一个对话框。

但每次我得到一个异常“没有找到 MaterialLocalizations”。如果试图显示我的对话框。为了测试,我添加了一个 RaisedButton 来显示这个警报,但同样的问题。也许有人可以帮助我。非常感谢!!!

这是我的小应用程序的全部代码:

import 'dart:async';

import 'package:firebase_messaging/firebase_messaging.dart';

import 'package:flutter/material.dart';

void main() => runApp(Main());

class Main extends StatefulWidget {
@override
_MainState createState() => _MainState();
}

class _MainState extends State<Main> {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

Widget _buildDialog(BuildContext context) {
print("_buildDialog");
return AlertDialog(
content: Text("Item has been updated"),
actions: <Widget>[
FlatButton(
child: const Text('CLOSE'),
onPressed: () {
Navigator.pop(context, false);
},
),
FlatButton(
child: const Text('SHOW'),
onPressed: () {
Navigator.pop(context, true);
},
),
],
);
}

void _showPushDialog() {
print("DIALOG");
showDialog<bool>(
context: context,
builder: (_) => _buildDialog(context),
).then((bool shouldNavigate) {
if (shouldNavigate == true) {
_navigateToPushDetail();
}
});
}

void _navigateToPushDetail() {
print("TODO: Goto...");
}

@override
void initState() {
super.initState();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("onMessage: $message");
//_neverSatisfied();
_showPushDialog();
},
onLaunch: (Map<String, dynamic> message) async {
print("onLaunch: $message");
_navigateToPushDetail();
},
onResume: (Map<String, dynamic> message) async {
print("onResume: $message");
_navigateToPushDetail();
},
);

_firebaseMessaging.requestNotificationPermissions(
const IosNotificationSettings(sound: true, badge: true, alert: true));
_firebaseMessaging.onIosSettingsRegistered
.listen((IosNotificationSettings settings) {
print("Settings registered: $settings");
});
_firebaseMessaging.getToken().then((String token) {
assert(token != null);
print("Push Messaging token: $token");
});
}

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Welcome to Flutter',
home: Scaffold(
appBar: AppBar(
title: Text('Welcome to Flutter'),
),
body: new Material(
child: Column(children: <Widget>[
Center(
child: Text('Hello World'),
),
RaisedButton(
onPressed: () {
print("pushed?");
_showPushDialog();
},
child: Text("press me"),
)
]),
),
),
);
}
}

最佳答案

flutter 1.0,飞镖 2.x

此解决方案适用于 StatelessWidget 小部件和 StatefulWidget 小部件。

在顶部,您可以在声明中创建静态 navKey:

class MyApp extends StatefulWidget {
final String title; // sample var you want to pass to your widget
static final navKey = new GlobalKey<NavigatorState>();
const MyApp({Key navKey, this.title}) : super(key: navKey);
@override
State<StatefulWidget> createState() => _MyAppState();
}

在布局部分你应该使用key:

return MaterialApp(
navigatorKey:MyApp.navKey,
title: widget.title,
...

因此,当您需要对话框或其他小部件的当前上下文时,您可以在状态部分执行以下操作:

@override
void initState() {
final context = MyApp.navKey.currentState.overlay.context;
showMyCustomDialog(context);
...
super.initState();
}

关于Flutter => showDialog/AlertDialog => 未找到 MaterialLocalizations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54035175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com