Flutter 如何在颤振中显示SnackBar?
我想在我的Flitter应用程序中显示一个SnackBar。我已经阅读并复印了文件:Flutter 如何在颤振中显示SnackBar?,flutter,widget,snackbar,Flutter,Widget,Snackbar,我想在我的Flitter应用程序中显示一个SnackBar。我已经阅读并复印了文件: 我的脚手架主体: Widget build(BuildContext context) { return WillPopScope( onWillPop: () async => false, child: Scaffold( appBar: AppBar( centerTitle: true, title: Text
我的脚手架主体:
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async => false,
child: Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text("Osztályok"),
leading: Padding(
padding: const EdgeInsets.only(left: 5.0),
child: IconButton(
icon: Icon(Icons.exit_to_app, color: Colors.white70),
onPressed: () {
authService.signOut();
authService.loggedIn = false;
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => GoogleSignUp()));
})),
actions: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 5.0),
child: Row(
children: <Widget>[
IconButton(
icon: Icon(Icons.add_circle_outline,
color: Colors.white70),
onPressed: () {
createPopup(context);
}),
// IconButton(
// icon: Icon(Icons.search, color: Colors.black38),
// onPressed: null),
],
)),
],
),
小部件构建(构建上下文){
返回式示波器(
onWillPop:()async=>false,
孩子:脚手架(
appBar:appBar(
标题:对,
标题:文本(“Osztályok”),
前导:填充(
填充:仅限常量边集(左:5.0),
孩子:我的钮扣(
图标:图标(Icons.exit_to_应用程序,颜色:Colors.white70),
已按下:(){
authService.signOut();
authService.loggedIn=false;
导航器。推(
上下文
材料路线(
生成器:(context)=>GoogleSignUp());
})),
行动:[
填充物(
填充:仅限常量边集(右:5.0),
孩子:排(
儿童:[
图标按钮(
图标:图标(Icons.add_circle_outline,
颜色:颜色。白色70),
已按下:(){
创建弹出窗口(上下文);
}),
//图标按钮(
//图标:图标(Icons.search,color:Colors.black38),
//onPressed:null),
],
)),
],
),
SnackBarPage类:
class SnackBarPage extends StatelessWidget {
void jelszopress(TextEditingController jelszoController, BuildContext context) async{
var jelszo;
DocumentReference docRef =
Firestore.instance.collection('classrooms').document(globals.getid());
await docRef.get().then((value) => jelszo= (value.data['Jelszo']) );
if (jelszo == jelszoController.text.toString()){
Navigator.push(context,
MaterialPageRoute(builder: (context) => InClassRoom()));
}
else{
Navigator.pop(context);
final snackBar = SnackBar(content: Text('Yay! A SnackBar!'));
Scaffold.of(context).showSnackBar(snackBar);
}
}
Future<String> jelszoba(BuildContext context) {
TextEditingController jelszoController = TextEditingController();
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Add meg a jelszót'),
content: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(20)),
),
child: TextField(
controller: jelszoController,
decoration: InputDecoration(hintText: "Jelszó")
)
),
actions: <Widget>[
MaterialButton(
elevation: 5.0,
child: Text('Mehet'),
onPressed: () {
jelszopress(jelszoController, context);
},
)]);
}
);
}
var nevek;
var IDS;
SnackBarPage(this.nevek, this.IDS);
@override
Widget build(BuildContext context){
return ListView.builder(
itemCount: nevek.length,
itemBuilder: (context, index) {
return Card(
child: ListTile(
onTap: () {
globals.setid(IDS[index]);
jelszoba(context);
},
title: Text(nevek[index]),
),
);
},
) ;
}
}
class SnackBarPage扩展了无状态小部件{
void jelszopress(TextEditingController jelszoController,BuildContext上下文)异步{
瓦尔·杰尔索;
DocumentReference docRef=
Firestore.instance.collection(“教室”).document(globals.getid());
等待docRef.get(),然后((value)=>jelszo=(value.data['jelszo']);
if(jelszo==jelszoController.text.toString()){
Navigator.push(上下文,
MaterialPackageRoute(生成器:(上下文)=>InClassRoom());
}
否则{
Navigator.pop(上下文);
final snackBar=snackBar(内容:Text('Yay!A snackBar!'));
脚手架.of(上下文).showSnackBar(snackBar);
}
}
未来的jelszoba(构建上下文){
TextEditingController-jelszoController=TextEditingController();
返回显示对话框(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:文本(“添加meg a jelszót”),
内容:容器(
装饰:盒子装饰(
borderRadius:borderRadius.all(半径圆形(20)),
),
孩子:TextField(
控制员:杰尔佐控制员,
装饰:输入装饰(hintText:“Jelszó”)
)
),
行动:[
材料按钮(
标高:5.0,
child:Text('Mehet'),
已按下:(){
jelszopress(jelszoController,context);
},
)]);
}
);
}
var nevek;
变量ID;
SnackBarPage(this.nevek,this.IDS);
@凌驾
小部件构建(构建上下文){
返回ListView.builder(
itemCount:nevek.length,
itemBuilder:(上下文,索引){
回程卡(
孩子:ListTile(
onTap:(){
setid(IDS[index]);
杰尔佐巴(上下文);
},
标题:文本(nevek[索引]),
),
);
},
) ;
}
}
但是我的cody没有显示SnackBar。我尝试了这个问题的解决方案:但是添加一个Builder小部件没有帮助。因此,根据错误,在
SnackBar.of()
中传递的上下文似乎不是正确的上下文。这在以下复制的&;和摘要的基础上是有意义的:
每个小部件都有自己的BuildContext,它成为无状态widget.build或State.build函数返回的小部件的父级。(同样,也是RenderObjectWidgets的任何子级的父级。)
特别是,这意味着在构建方法中,构建方法的小部件的构建上下文与该构建方法返回的小部件的构建上下文不同
因此,这意味着您在jelszoba(context)
函数中传递的构建上下文不是您需要的构建上下文,实际上是正在实例化Scaffold的小部件的构建上下文
那么如何修复:
要修复此问题,请将您的卡片小部件包装在生成器小部件的SnackbarPage中,并将上下文从它传递到jelszoba(context)
方法
下面是我发布的一个例子:
@override
Widget build(BuildContext context) {
// here, Scaffold.of(context) returns null
return Scaffold(
appBar: AppBar(title: Text('Demo')),
body: Builder(
builder: (BuildContext context) {
return FlatButton(
child: Text('BUTTON'),
onPressed: () {
// here, Scaffold.of(context) returns the locally created Scaffold
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('Hello.')
));
}
);
}
)
);
}
您通常可以通过这种方式使用底部导航栏中的“快餐吧”。但是,如果您想在主体中显示它,则只需从生成器复制代码并将其粘贴到脚手架主体中即可
Scaffold(bottomNavigationBar: Builder(builder: (context) => Container(child: Row(children: <Widget>[
Icon(Icons.add_alarm), Icon(Icons.map), IconButton(icon: Icon(Icons.bookmark),
onPressed:() {
Scaffold.of(context).showSnackBar(mySnackBar);
final mySnackBar = SnackBar(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
behavior: SnackBarBehavior.floating,
backgroundColor: Colors.white, duration: Duration(seconds: 1),
content: Text(
'Article has been removed from bookmarks',
),);
}
),
],
),
),
),
);
Scaffold(底部导航栏:生成器(生成器:(上下文)=>容器(子项:行(子项:[
图标(Icons.add_alarm)、图标(Icons.map)、图标按钮(Icon:Icon(Icons.bookmark)),
已按下:(){
Scaffold.of(context).showSnackBar(mysnakbar);
最终mysnakbar=SnackBar(
形状:圆形RectangleBorder(borderRadius:borderRadius.circular(20)),
行为:SnackBarBehavior.floating,
背景颜色:Colors.white,持续时间:持续时间(秒数:1),
内容:文本(
“文章已从书签中删除”,
),);
}
),
],
),
),
),
);
注意:在SnackBar的Behavior属性中,您可以将其保留为空。但问题是“如果您有弯曲的导航栏或底部导航栏上方有一个浮动操作按钮,则SnackBar将提升这些图标(或FAB),并将影响
@override
Widget build(BuildContext context) {
// here, Scaffold.of(context) returns null
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: const Text('snack'),
duration: const Duration(seconds: 1),
action: SnackBarAction(
label: 'ACTION',
onPressed: () { },
),
));
},
child: const Text('SHOW SNACK'),
),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// Must be MaterialApp widget for ScaffoldMessenger support.
return MaterialApp(
title: 'My App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyDashboard(),
);
}
}