flutter - 使用 BottomSheet 时未找到 Scaffold 小部件
问题描述
我刚刚学习 Flutter 并陷入了这个错误:
No Scaffold widget found.
Home widgets require a Scaffold widget ancestor.
The specific widget that could not find a Scaffold ancestor was: Home
The ancestors of this widget were
但正如你从我的代码中看到的那样,我确实有一个脚手架,我尽可能地添加它,但我没有工作。
我在那里做了或没有注意到的原因是什么?
import 'package:firebase_redux_app/services/firebase.auth.dart';
import 'package:flutter/material.dart';
// import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_redux_app/services/firestore.dart';
import 'package:provider/provider.dart';
import 'package:firebase_redux_app/screens/home/brewList.dart';
import 'package:firebase_redux_app/models/brew.dart';
class Home extends StatelessWidget {
final AuthService _auth = AuthService();
@override
Widget build(BuildContext context) {
void _showSettingsPanel() {
showBottomSheet(
context: context,
builder: (context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 60.0),
child: Text('bottom sheet'),
);
});
}
return StreamProvider<List<Brew>>.value(
value: DBFirestore().brews,
child: Scaffold(
backgroundColor: Colors.brown[50],
appBar: AppBar(
title: Text('Brew Crew'),
backgroundColor: Colors.brown[400],
elevation: 0.0,
actions: <Widget>[
FlatButton.icon(
onPressed: () async {
await _auth.signOut();
},
icon: Icon(Icons.person),
label: Text('Log Out')),
FlatButton.icon(
icon: Icon(Icons.settings),
label: Text('settings'),
onPressed: () => _showSettingsPanel(),
)
],
),
body: BrewList(),
),
);
}
}
解决方案
此错误是由于您的_showSettingsPanel
方法的范围引起的
你可以做两件事
1.
在_showSettingsPanel
创建一个方法,Home
并允许它以上下文作为参数。因此,将您的设置 包装FlatButton
在 a 中Builder
并将 传递context
给该_showSettingsPanel
方法。
像这样
class Home extends StatelessWidget {
void _showSettingsPanel(context) {
showBottomSheet(
context: context,
builder: (context) {
return Container(
padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 60.0),
child: Text('bottom sheet'),
);
});
}
@override
Widget build(BuildContext context) {
return StreamProvider<List<Brew>>(
value: DBFireStore().brews
child: Scaffold(
backgroundColor: Colors.brown[50],
appBar: AppBar(
title: Text('Brew Crew'),
backgroundColor: Colors.brown[400],
elevation: 0.0,
actions: <Widget>[
FlatButton.icon(
onPressed: () async {
},
icon: Icon(Icons.person),
label: Text('Log Out')),
Builder(
builder: (context) {
return FlatButton.icon(
icon: Icon(Icons.settings),
label: Text('settings'),
onPressed: () => _showSettingsPanel(context),
);
}
)
],
),
body: BrewList(),
),
);
}
}
2.Home
将小部件
包装Scaffold
在您使用它的任何地方,而不是仅使用Home
像这样
Scaffold(body: Home())
推荐阅读
- mysql - 使用数据库名称获取 mysql 数据库处理程序
- gulp - Gulp Nunjucks:不区分大小写包括?
- javascript - getElementById 问题和对动态创建的元素的类似调用
- google-cloud-platform - Dataproc 集群属性(核心、内存和 memoryOverhead)设置
- java - 如何获取要保存到 MDC 的请求标头
- javascript - 环境变量不起作用(Next.JS 9.4.4)
- c# - 对象不能存储在这种类型的数组中。MVC c#中的问题
- python - 在文件 python 中添加一个新的特定行
- html - 我能怎么做?CSS Flexbox 布局问题
- python - 如何解决 Selenium 错误 - 无法访问 chrome