【发布时间】:2018-11-01 19:58:09
【问题描述】:
如 Scaffold 的 of method 手册中所述,将小吃栏显示为操作的输出需要为 Scafold.of() 创建子上下文。
但我找不到此处描述的这种更“有效方法”的示例。
更有效的解决方案是将构建函数拆分为多个 小部件。这引入了一个新的上下文,您可以从中获取 脚手架。在此解决方案中,您将有一个外部小部件 创建由新内部小部件实例填充的 Scaffold, 然后在这些内部小部件中,您将使用 Scaffold.of。
我想使用这种方法,因为所有递归缩进都很难阅读。我已经尝试使用函数创建表单的提交按钮,甚至尝试扩展 RaisedButton 类(因此 Scaffold.of 将在文档中指出的新实例化 Widget 中被调用)无济于事。
只有当我在我的应用程序的主 Scaffold 中使用另一个 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'),
),
],
),
),
);
如何删除Builder 并简化它?
我还尝试进一步扩展 RaisedButton build() 方法,但陷入了依赖/打字混乱。我找不到这样的例子。
【问题讨论】: