flutter widget组件之-----------表单组件

flutter widget组件之-----------表单组件

widget分为两类:widgets library中的标准widget和Material Components library中的专用widget;任何应用程序都可以使用widgets library中的widget,但只有Material应用程序可以使用Material Components库。其中Card,ListTitle就是Material Components库中的组件。

Form FormField

Form: 一个可选的、用于给多个TextField分组的widget
FormField: 一个单独的表单字段。此widget维护表单字段的当前状态,以便在UI中直观地反映更新和验证错误

  • 构造函数
Form({
    Key key,
    @required this.child, // 子部件
    this.autovalidate = false,//自动校验
    this.onWillPop,//允许否决用户关闭表单时的路由尝试
    this.onChanged,//变化时的回调函数
})
 FormField({
    Key key,
    @required this.builder,//创建者
    this.onSaved,//保存回调函数
    this.validator,//校验器
    this.initialValue,//初始值
    this.autovalidate = false,// 是否自动验证
    this.enabled = true,//表单是否可以接受到用户的输入
  })

 
  • 应用示例
import 'package:flutter/material.dart';

class MyApp extends StatefulWidget {
  @override
  _MyApp createState() => new _MyApp();
}

class _MyApp extends State<MyApp> {

  String _lastName;
  String _firstName;
//   FormState为Form的State类,可以通过Form.of()或GlobalKey获得。我们可以通过它来对Form的子元素FormField进行统一操作,我们看看其常用的三个方法:
  GlobalKey<FormState> _formKey = new GlobalKey<FormState>();

  void _showMessage(String name) {
    showDialog<Null>(
        context: context,
        child: new AlertDialog(
            content: new Text(name),
            actions: <Widget>[
              new FlatButton(
                  onPressed: () {
                    Navigator.pop(context);
                  },
                  child: new Text('确定')
              )
            ]
        )
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
            title: new Text('表单输入')
        ),
        // Form:用于将多个表单控件组合在一起的容器
        body: new Form(
            key: _formKey,
            autovalidate:true ,
            //变化时的回调函数
            onChanged: (){
              print('object..........');
            },
            // 子部件
            child: new Column(
                children: <Widget> [
                  FormField(
                    //构建子部件
                    builder: (FormFieldState field){
                      return TextFormField();
                    },
                    //初始值
                    initialValue: "100",
                    //保存回调函数
                    onSaved: (val){
                      print("...........formfield save...."+val.toString());
                    },
                    //校验器
                    validator: (val){
                      print("validator......."+val.toString());
                    },
                    // 是否自动验证
                    autovalidate: true,
                    //表单是否可以接受到用户的输入 没毛用呀
                    enabled: false, 
                  ),
                  // TextFieldd:包含输入的表单控件,每个表单字段都应该在FormField控件中
                  new TextFormField(
                      decoration:InputDecoration(labelText:'姓氏' ) ,
                      // onSaved:当通过Form.save()保存表单时调用的方法
                      onSaved: ( value) {
                        _lastName = value;
                      }
                  ),
                  new Row(
                      children: <Widget> [
                        new RaisedButton(
                            child: new Text('重置'),
                            onPressed: () {
                              // reset():将此Form下的每个TextField重置为初始状态
                              _formKey.currentState.reset();
                              _showMessage('姓名信息已经重置');
                            }
                        ),
                        new RaisedButton(
                            child: new Text('提交'),
                            onPressed: () {
                              // save():保存Form下的每个TextField
                              _formKey.currentState.save();
                              _showMessage('你的姓名是'+_lastName+_firstName);
                            }
                        )
                      ]
                  )
                ]
            )
        )
    );
  }
}

void main() {
  runApp(new MaterialApp(
      title: 'Flutter Demo',
      home: new MyApp()
  ));
}

RawKeyboardListener

每当用户按下或释放键盘上的键时调用回调的widget。

  • 构造函数
RawKeyboardListener({
    Key key,
    @required this.focusNode,
    @required this.onKey,
    @required this.child,
  }) 
 
  • 应用示例
class _MyStatefulWidgetState extends State<MyStatefulWidget> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Form textformfield"),),
      body: Center(
        child: Column(
          children: <Widget>[
            RawKeyboardListener(
              child: Text("data"),
              focusNode: FocusNode(),// 不知道怎么用呀
              // onKey: ,
            )
          ],
        ),
      ),
    );
  }
}

这个错误是由于无法连接到本地主机的10248端口导致的。这个端口通常是kubelet进程监听的端口,用于健康检查。出现这个错误可能是由于kubelet进程没有正确启动或者配置错误导致的。 解决这个问题的方法是检查kubelet进程的状态和配置。你可以按照以下步骤进行操作: 1. 检查kubelet进程是否正在运行。你可以使用以下命令检查kubelet进程的状态: ```shell systemctl status kubelet ``` 如果kubelet进程没有运行,你可以使用以下命令启动它: ```shell systemctl start kubelet ``` 2. 检查kubelet的配置文件。你可以使用以下命令查看kubelet的配置文件路径: ```shell kubelet --kubeconfig /etc/kubernetes/kubelet.conf --config /var/lib/kubelet/config.yaml --bootstrap-kubeconfig /etc/kubernetes/bootstrap-kubelet.conf config view ``` 确保配置文件中的端口号和地址正确,并且与你的环境相匹配。 3. 检查网络连接。你可以使用以下命令检查是否可以连接到localhost10248端口: ```shell curl -sSL http://localhost:10248/healthz ``` 如果无法连接,请确保端口没有被防火墙或其他网络配置阻止。 4. 检查docker的配置。有时候,kubelet进程依赖于docker进程。你可以按照以下步骤检查docker的配置: - 创建/etc/docker目录: ```shell sudo mkdir /etc/docker ``` - 编辑/etc/docker/daemon.json文件,并添加以下内容: ```json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "registry-mirrors": ["https://tdhp06eh.mirror.aliyuncs.com"] } ``` - 重启docker进程: ```shell systemctl restart docker ``` 请注意,以上步骤是一种常见的解决方法,但具体解决方法可能因环境而异。如果以上步骤无法解决问题,请提供更多的错误信息和环境配置,以便我们能够更好地帮助你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值