【问题标题】:Use SnackBar with CupertinoPageScaffold将 SnackBar 与 CupertinoPageScaffold 一起使用
【发布时间】:2019-08-18 08:12:08
【问题描述】:

有没有办法将SnackBarCupertinoPageScaffold 一起使用?

我收到以下错误:

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().

使用以下方法在子小部件中调用SnackBar

final snackBar = SnackBar(
      content: Text('Yay! A SnackBar!'),
      action: SnackBarAction(
      label: 'Undo',
      onPressed: () {
      // Some code to undo the change!
      },
      ),
      );

// Find the Scaffold in the Widget tree and use it to show a SnackBar!
Scaffold.of(context).showSnackBar(snackBar);

【问题讨论】:

标签: dart flutter flutter-cupertino


【解决方案1】:

Cupertino 小部件应该是特定于 iOS 的,SnackBar 来取代 Android Toasts 但在 iOS 中没有 Android Toast 等价物,因此您不能将 SnackBar 本地添加到 CupertinoScaffold,因为它会不遵循 iOS 准则。

一种解决方案是扩展 CupertinoScaffold 并将其添加到 SnackBar 代码。

另一个在 Mazin Ibrahim answer,注意不建议嵌套 Scaffolds。

【讨论】:

  • 感谢您的回答。绝对希望避免嵌套脚手架。扩展 Flutter 小部件是一种常见的模式吗?在 iOS 上通过CupertinoPageScaffold 显示类似小吃店或类似烤面包的消息的最常见方法是什么?还是CupertinoPageScaffold 真的不适合定时消息,而只使用Scaffold?尝试学习 Cupertino 并将其与 Material 集成,但各个方面似乎有点限制。
  • 是的,Flutter 小部件没有提供您想要的扩展它是一个好主意。我并没有真正使用太多 Cupertino 小部件,所以我不知道常见的行为是什么,也许使用 CupertinoAlertDiaolg 和计时器让它们消失?但这会冻结用户界面...我认为如果您不想为此花费很多时间,使用Scaffold 是您最好的方法。 ScaffoldCupertinoScaffold 并没有太大的不同,我认为你不会很难让 Scaffold 看起来像 CupertinoScaffold
【解决方案2】:

您需要包含Scaffold,因为CupertinoPageScaffold 不是它的子对象,然后您需要将调用showSnackBar 函数的代码与Scaffold 的代码分开到一个单独的类中这里是SnackBarBody,因为不能从同一个Build 函数调用SnackBarScaffold。这是一个完整的工作示例:

import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';

void main() => runApp(SnackBarDemo());

class SnackBarDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
     title: 'SnackBar Demo',
     home: CupertinoPageScaffold(
    child: SnackBarPage(),
       ),
     );
   }
 }

class SnackBarPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
   body: SnackBarBody(),
   );
 }
}

class SnackBarBody extends StatefulWidget {
  SnackBarBody({Key key,}):
      super(key: key);

  @override
  _SnackBarBodyState createState() => new _SnackBarBodyState();
}

class _SnackBarBodyState extends State<SnackBarBody> {

@override
Widget build(BuildContext context) {
  return Center(
    child: RaisedButton(
      onPressed: () {
        final snackBar = SnackBar(content: Text('Yay! A SnackBar!'),action: SnackBarAction(label: 'Undo',
          onPressed: () {
            // Some code to undo the change!
          },
        ),
      );

        // Find the Scaffold in the Widget tree and use it to show a SnackBar!
        Scaffold.of(context).showSnackBar(snackBar);
       },
      child: Text('Show SnackBar'),
     ),
   );
  }
}

【讨论】:

  • 我不确定这是否是理想的解决方案。 Flutter 建议不要嵌套 Scaffolds,因为它可能会导致意外行为。如果我使用的是基于 Cupertino 的应用程序,似乎我无法使用小吃吧。
  • 我同意艾伦的观点。如果您急需Scaffold,我认为这是唯一可用的方法。
猜你喜欢
  • 2015-10-03
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
相关资源
最近更新 更多