【问题标题】:Show snackbar when item is tapped in bottom sheet在底部工作表中点击项目时显示小吃栏
【发布时间】:2019-01-10 18:25:23
【问题描述】:

我想在底部工作表中单击项目时显示Snackbar。我试过这个。

@override
Widget build(BuildContext defaultContext) {
  return Scaffold(
    body: Center(
      child: RaisedButton(
        onPressed: () => showModalBottomSheet(
              context: defaultContext,
              builder: (BuildContext context) {
                return Builder(
                  builder: (BuildContext builderContext) {
                    return ListTile(
                      title: Text("Click me"),
                      onTap: () {
                        Navigator.pop(builderContext); // hiding bottom sheet
                        Scaffold.of(builderContext).showSnackBar(SnackBar(content: Text("Hi")));
                      },
                    );
                  },
                );
              },
            ),
      ),
    ),
  );
}

但我有错误

使用不包含 Scaffold 的上下文调用 Scaffold.of()

注意该问题与this不重复

PS:我知道我可以在Scaffold 中使用GlobalKey 来显示Snackbar,但我想使用Builder 来做到这一点,就像docs suggest 一样使用Builder。我确实使用了builder,但它不起作用。

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    这终于成功了。

    @override
    Widget build(BuildContext defaultContext) {
      return Scaffold(
        body: Center(
          child: Builder(builder: (builderContext) {
            return RaisedButton(
              onPressed: () => showModalBottomSheet(
                context: defaultContext,
                builder: (BuildContext context) {
                  return ListTile(
                    title: Text("Click me"),
                    onTap: () {
                      Navigator.pop(builderContext); // hiding bottom sheet
                      Scaffold.of(builderContext).showSnackBar(SnackBar(content: Text("Hi")));
                    },
                  );
                },
              ),
            );
          },),
        ),
      );
    }
    

    我需要将Builder 向上移动。不知道原因,但它奏效了。

    【讨论】:

    • 谁能告诉我为什么将Builder 移到树上使它起作用?
    • 它在最接近的上下文 (context1) 中找到上面最接近的 Scaffold。虽然您的错误示例在 context2/RaisedButton 中找到了它,但没有。
    • @mnemonic23 谢谢,但我的命名约定太糟糕了,我更新了约定并格式化了代码,你现在能告诉我使用更新后的名称吗?
    • 这个想法是,您必须将“Builder”放置在 Scaffold 下方的某个位置,但仍位于 Scaffold 所在的同一 BuildContext 中(即 defaultContext)。发生错误是因为您将“Builder”放在另一个上下文中(属于 showModalBottomSheet)。
    • 我认为这解释了为什么我们需要额外的 Builder 来使 showSnackBar 工作。 docs.flutter.io/flutter/material/Scaffold/of.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2020-12-11
    • 2015-09-15
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多