带有上下文的showBottomSheet脚手架问题

时间:2019-05-20 11:23:42

标签: dart flutter

试图在我的应用程序中实现showBottomSheet,但它抛出一个错误:Scaffold.of()在不包含Scaffold的上下文中调用。

在网上搜索了一下之后,我添加了一个GlobalKey,但这似乎并没有解决问题。有人有建议吗?

class _DashboardState extends State<Dashboard> {
  final _scaffoldKey = GlobalKey<ScaffoldState>();
  int _bottomNavBarCurrentIndex = 0;
  dashboardViews.DashboardView dView = new dashboardViews.DashboardView();

  List<Widget> _listOffers = new List<Widget>();

  Widget _currentView;

  void loadDashboardView() {
    _currentView = (_bottomNavBarCurrentIndex == 0
        ? dView.getOfferView(_listOffers, _getOfferData)
        : dView.getOrdersView());
  }

  _showInfoSheet() {
    showBottomSheet(
                context: _scaffoldKey.currentContext,
                builder: (context) {
                  return Text('Hello');
                });
  }

  Future _getOfferData() async {
    loadDashboardView();

    List<Widget> _resultsOffers = new List<Widget>();

    SharedPreferences prefs = await SharedPreferences.getInstance();
    String _token = prefs.getString('token');

    final responseOffers =
        await http.get(globals.apiConnString + 'GetActiveOffers?token=$_token');

    if (responseOffers.statusCode == 200) {
      List data = json.decode(responseOffers.body);

      for (var i = 0; i < data.length; i++) {       
        _resultsOffers.add(GestureDetector(
            onTap: () => _showInfoSheet(),
            child: Card(
                child: Padding(
                    padding: EdgeInsets.all(15),
                    child: Column(
                        mainAxisAlignment: MainAxisAlignment.start,
                        children: <Widget>[
                          Row(children: <Widget>[
                            Expanded(
                                flex: 5,
                                child: Text('${data[i]['Title']}',
                                    style: TextStyle(
                                        fontWeight: FontWeight.bold,
                                        color: globals.themeColor4))),
                            Expanded(
                                flex: 3,
                                child: Row(children: <Widget>[
                                  Icon(Icons.access_time,
                                      size: 15, color: Colors.grey),
                                  Padding(
                                      padding: EdgeInsets.fromLTRB(5, 0, 10, 0),
                                      child: Text('11:30 PM',
                                          style:
                                              TextStyle(color: Colors.black))),
                                ])),
                            Expanded(
                                flex: 1,
                                child: Row(children: <Widget>[
                                  Icon(Icons.local_dining,
                                      size: 15, color: Colors.grey),
                                  Padding(
                                      padding: EdgeInsets.fromLTRB(5, 0, 0, 0),
                                      child: Text('${i.toString()}',
                                          style:
                                              TextStyle(color: Colors.black))),
                                ])),
                          ]),
                          Padding(padding: EdgeInsets.all(10)),
                          Row(children: <Widget>[
                            Text(
                              'Created May 2, 2019 at 2:31 PM',
                              style: TextStyle(color: Colors.grey[600]),
                              textAlign: TextAlign.start,
                            )
                          ])
                        ])))));
           }       
      }

      setState(() {
        _listOffers = _resultsOffers;
      });

      loadDashboardView();
    }
  }

  void _bottomNavBarTap(int index) {
    setState(() {
      _bottomNavBarCurrentIndex = index;
      loadDashboardView();
    });
  }

  void pullRefresh() {
    _getOfferData();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      backgroundColor: Colors.grey[200],
      body: _currentView,
      bottomNavigationBar: BottomNavigationBar(
        onTap: _bottomNavBarTap,
        currentIndex: _bottomNavBarCurrentIndex,
        items: [
          BottomNavigationBarItem(
              icon: Icon(Icons.near_me), title: Text('OFFERS')),
          BottomNavigationBarItem(
              icon: Icon(Icons.broken_image), title: Text('ORDERS'))
        ],
      ),
    );
  }
}

希望有人可以指出正确的方向,谢谢!

编辑:这是我看到的具有相同问题的链接之一,我尝试按照建议将生成器上下文设置为c,但没有用:https://github.com/flutter/flutter/issues/23234

编辑2:添加截屏,当我在不包含Scaffold错误的上下文中调用Scaffold.of()时显示可变内容。

error screenshot

1 个答案:

答案 0 :(得分:0)

出现此错误的原因是因为您在构建过程中正在调用Scaffold,因此您的showBottomSheet函数看不到它。解决此问题的方法是为有状态的小部件提供一个Scaffold,为Scaffold分配一个密钥,然后将其传递给您的Dashboard(我假设这是您的有状态小部件的名称从您的州级)。您无需为Scaffold的{​​{1}}内的build分配密钥。

这是您为_DashboardState提供Scaffold的课程:

key

您原来的 class DashboardPage extends StatefulWidget { @override _DashboardPageState createState() => _DashboardPageState() ; } class _DashboardPageState extends State<DashboardPage> { final GlobalKey<ScaffoldState> scaffoldStateKey ; @override Widget build(BuildContext context) { return Scaffold( key: scaffoldStateKey, body: Dashboard(scaffoldKey: scaffoldStateKey), ); } 已更改:

Dashboard

您的 class Dashboard extends StatefulWidget{ Dashboard({Key key, this.scaffoldKey}): super(key: key); final GlobalKey<ScaffoldState> scaffoldKey ; @override _DashboardState createState() => new _DashboardState(); } 进行了概述:

_DashboardState