按照scaffold'sof method手册中的说明,将snackbar显示为操作的输出需要为scaffold.of()创建子上下文。
但我找不到一个更“有效方法”的例子。
一个更有效的解决方案是将构建函数拆分为多个
小部件。这将引入一个新的上下文,从中可以获取
脚手架。在这个解决方案中,您将拥有一个
创建由新内部小部件的实例填充的脚手架,
然后在这些内部小部件中,您将使用scaffold.of。
我想使用这个方法,因为所有的递归缩进都是很难读取的。我已经尝试用函数创建表单的提交按钮,甚至尝试扩展raisedbutton类(因此,如文档中所述,将在新的实例化小部件中调用Scaffold.of)以使其无效。
只有当我在我的应用程序的主应用程序中使用另一个Builder时,它才起作用。
这个工作

class MyForm extends StatefulWidget {
  Login({Key key, this.title}) : super(key: key);
  final String title;

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

class _MyFormState extends State<MyForm> {
  @override
  Widget build(BuildContext context) {
    final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
    return new Scaffold(
      body: new Builder(
        builder: (BuildContext context) {
          return new ListView(
            children: <Widget>[
              myForm(context, _formKey),
            ],
          );
        },
      ),
    );
  }
}

class SubmitButton extends RaisedButton {
  SubmitButton({
    Key key,
    this.onPressed,
    this.child,
  }) : super(key: key, onPressed: onPressed, child: child);
  final VoidCallback onPressed;
  final Widget child;

  @override
  Widget build(BuildContext context) {
    return super.build(context);
  }
}

Widget myForm(
  BuildContext context,
  GlobalKey<FormState> _formKey) => new Container(
  child: new Form(
    key: _formKey,
    child: new Column(
      children: <Widget>[
        new TextFormField(
          validator: (value) {
            if (value.isEmpty) {
              return 'Write Something';
            }
          },
        ),
        new SubmitButton(
          onPressed: () {
            if (_formKey.currentState.validate()) {
              Scaffold.of(context).showSnackBar(
                  new SnackBar(content: new Text('Processing'))
              );
            }
          },
          child: new Text('Submit'),
        ),
      ],
    ),
  ),
);

如何删除Scaffold并简化它?
我还试图进一步扩展方法,但陷入了依赖/键入混乱。我找不到这样的例子。

最佳答案

一个简单的方法就是在一个小部件的构建函数中创建scaffold,在另一个小部件的构建函数中创建按钮。(顺便说一下,代码中的split your build function into several widgets函数没有效果,因为它是作为同一生成函数的一部分运行的,因此上下文的值是相同的。)我重构了代码,以引入一个构建scaffold的mypage小部件,并将其余部分保留在myform小部件中。但是,我们现在有两种不同的构建方法:一种构建脚手架,另一种构建需要访问脚手架的表单和按钮。

class MyPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new MyForm(),
    );
  }
}

class MyForm extends StatefulWidget {
  @override
  _MyFormState createState() => new _MyFormState();
}

class _MyFormState extends State<MyForm> {
  final _formKey = new GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return new ListView(
      children: <Widget>[
        new Container(
          child: new Form(
            key: _formKey,
            child: new Column(
              children: <Widget>[
                new TextFormField(
                  validator: (value) =>
                      (value.isEmpty) ? 'write something' : null,
                ),
                new RaisedButton(
                  onPressed: () {
                    if (_formKey.currentState.validate()) {
                      Scaffold.of(context).showSnackBar(new SnackBar(
                            content: new Text('Processing'),
                          ));
                    }
                  },
                  child: new Text('Submit'),
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

关于flutter - 如何实现Scaffold.of()包装的“有效方式”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50478016/

10-10 08:20