Snackbar 和异常:scaffold.of()
Posted
技术标签:
【中文标题】Snackbar 和异常:scaffold.of()【英文标题】:Snackbar and exception: scaffold.of() 【发布时间】:2020-08-08 12:11:00 【问题描述】:为什么在点击我的iconButton
我的snackBar
后会抛出Scaffold.of()
异常?
Scaffold.of() called with a context that does not contain a Scaffold.
No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This usually happens when the context provided is from the same StatefulWidget as that whose build function actually creates the Scaffold widget being sought.
There are several ways to avoid this problem. The simplest is to use a Builder to get a context that is "under" the Scaffold. For an example of this, please see the documentation for Scaffold.of():
https://api.flutter.dev/flutter/material/Scaffold/of.html
A more efficient solution is to split your build function into several widgets. This introduces a new context from which you can obtain the Scaffold. In this solution, you would have an outer widget that creates the Scaffold populated by instances of your new inner widgets, and then in these inner widgets you would use Scaffold.of().
A less elegant but more expedient solution is assign a GlobalKey to the Scaffold, then use the key.currentState property to obtain the ScaffoldState rather than using the Scaffold.of() function.
The context used was:
Builder
我的代码:
: Scaffold(
backgroundColor: Colors.white,
body: Container(
child: ListView.builder(
itemCount: user.getInvolvedEvents.length,
itemBuilder: (context, i)
return GestureDetector(
onTap: ()
//
,
child: Container(
height: 160.0,
margin: EdgeInsets.all(5),
child: Card(
child: Container(
decoration: BoxDecoration(
child: Stack(
alignment: Alignment.bottomLeft,
children: <Widget>[
Positioned(
bottom: 15,
right: 20,
child: Row(
children: <Widget>[
IconButton(
icon: Icon(Icons.cancel, color: Colors.red, size: 35),
onPressed: ()
return showDialog(
context: context,
builder: (BuildContext context)
return AlertDialog(
content: Text('Czy napewno chcesz odwołać swój udział w wydarzeniu "$user.getInvolvedEvents[i].title"?'),
actions: <Widget>[
FlatButton(
child: Text(
'TAK',
style: TextStyle(
fontWeight: FontWeight.bold,
color: Colors.black),
),
onPressed: () async
bool status = await removeFromInterested(user.getInvolvedEvents[i].id);
if(status)
Navigator.of(context).pop(null);
final snackBar = SnackBar(
duration: const Duration(seconds: 3),
content: Text('Nie weźmiesz udziału w wydarzeniu'),
);
Scaffold.of(context).showSnackBar(snackBar);
,
),
感谢您的帮助:)
【问题讨论】:
【参考方案1】:这是因为您使用的context
中的Alert
不包含scaffold
。
您可以改用GlobalKey
:
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context)
return Scaffold(
key: _scaffoldKey,
)
并显示小吃吧:
_scaffoldKey.currentState.showSnackBar(
SnackBar(
content: Text('Text'),
)
);
【讨论】:
以上是关于Snackbar 和异常:scaffold.of()的主要内容,如果未能解决你的问题,请参考以下文章
如何在 EventChannel.listen 的回调 onEvent 中显示 SnackBar
Flutter 问题系列第 76 篇在 Flutter 中 Builder 组件的作用以及如何解决 Scaffold.of 找不到上下文问题的解决文案