为什么有时小吃店会失败
Why sometimes snackbar is failing
请帮忙解释为什么有时我的 SnackBar 会显示错误。我不明白问题会在什么情况下出现。我只想指出,即使它显示错误,但在应用程序本身中,它运行正常。
这是我的代码:
void showFailedSnackBar(String s) {
SnackBar snackBar = SnackBar(
content: Text(s),
duration: Duration(seconds: 3),
backgroundColor: Theme.of(context).primaryColor,
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
这是错误:
E/flutter ( 7879): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: This widget has been unmounted, so the State no longer has a context (and should be considered defunct).
E/flutter ( 7879): Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.
尝试检查三个widget是否仍然挂载:
void showFailedSnackBar(String s) {
if (mounted) {
SnackBar snackBar = SnackBar(
content: Text(s),
duration: Duration(seconds: 3),
backgroundColor: Theme.of(context).primaryColor,
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
}
在您的函数 showSnackbar 中,除了字符串之外,您还可以传递一个 BuildContext 上下文变量,这样您就知道传递了哪个上下文,例如
SnackBar snackBar = SnackBar(
content: Text(s),
duration: Duration(seconds: 3),
backgroundColor: Theme.of(context).primaryColor,
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
您可以保存您确信它存在于提供程序中的脚手架的上下文,以便将它传递到您需要它的地方。
在 main.dart
中定义全局导航器上下文,并在任何地方使用它
// main.dart
final navigatorKey = GlobalKey<NavigatorState>(); // define global key
void main() => runApp(
MaterialApp(
...
navigatorKey: navigatorKey, // propagate to all descendant contexts
),
);
// other.dart
void showMyDialog() {
showDialog(
context: navigatorKey.currentContext, // reference global context
builder: (context) => ...
);
}
像这样使用 SnackBar
import 'package:flutter/material.dart';
void main() => runApp(const SnackBarDemo());
class SnackBarDemo extends StatelessWidget {
const SnackBarDemo({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SnackBar Demo',
home: Scaffold(
appBar: AppBar(
title: const Text('SnackBar Demo'),
),
body: const SnackBarPage(),
),
);
}
}
class SnackBarPage extends StatelessWidget {
const SnackBarPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: ElevatedButton(
onPressed: () {
final snackBar = SnackBar(
content: const Text('Yay! A SnackBar!'),
action: SnackBarAction(
label: 'Undo',
onPressed: () {
// Some code to undo the change.
},
),
);
// Find the ScaffoldMessenger in the widget tree
// and use it to show a SnackBar.
ScaffoldMessenger.of(context).showSnackBar(snackBar);
},
child: const Text('Show SnackBar'),
),
);
}
}
请帮忙解释为什么有时我的 SnackBar 会显示错误。我不明白问题会在什么情况下出现。我只想指出,即使它显示错误,但在应用程序本身中,它运行正常。
这是我的代码:
void showFailedSnackBar(String s) {
SnackBar snackBar = SnackBar(
content: Text(s),
duration: Duration(seconds: 3),
backgroundColor: Theme.of(context).primaryColor,
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
这是错误:
E/flutter ( 7879): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: This widget has been unmounted, so the State no longer has a context (and should be considered defunct).
E/flutter ( 7879): Consider canceling any active work during "dispose" or using the "mounted" getter to determine if the State is still active.
尝试检查三个widget是否仍然挂载:
void showFailedSnackBar(String s) {
if (mounted) {
SnackBar snackBar = SnackBar(
content: Text(s),
duration: Duration(seconds: 3),
backgroundColor: Theme.of(context).primaryColor,
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
}
在您的函数 showSnackbar 中,除了字符串之外,您还可以传递一个 BuildContext 上下文变量,这样您就知道传递了哪个上下文,例如
SnackBar snackBar = SnackBar(
content: Text(s),
duration: Duration(seconds: 3),
backgroundColor: Theme.of(context).primaryColor,
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
您可以保存您确信它存在于提供程序中的脚手架的上下文,以便将它传递到您需要它的地方。
在 main.dart
中定义全局导航器上下文,并在任何地方使用它
// main.dart
final navigatorKey = GlobalKey<NavigatorState>(); // define global key
void main() => runApp(
MaterialApp(
...
navigatorKey: navigatorKey, // propagate to all descendant contexts
),
);
// other.dart
void showMyDialog() {
showDialog(
context: navigatorKey.currentContext, // reference global context
builder: (context) => ...
);
}
像这样使用 SnackBar
import 'package:flutter/material.dart';
void main() => runApp(const SnackBarDemo());
class SnackBarDemo extends StatelessWidget {
const SnackBarDemo({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'SnackBar Demo',
home: Scaffold(
appBar: AppBar(
title: const Text('SnackBar Demo'),
),
body: const SnackBarPage(),
),
);
}
}
class SnackBarPage extends StatelessWidget {
const SnackBarPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: ElevatedButton(
onPressed: () {
final snackBar = SnackBar(
content: const Text('Yay! A SnackBar!'),
action: SnackBarAction(
label: 'Undo',
onPressed: () {
// Some code to undo the change.
},
),
);
// Find the ScaffoldMessenger in the widget tree
// and use it to show a SnackBar.
ScaffoldMessenger.of(context).showSnackBar(snackBar);
},
child: const Text('Show SnackBar'),
),
);
}
}