Flutter 表单介绍

Flutter中常见的表单有TextField单行文本框,TextField多行文本框、CheckBox、Radio、SwitchCheckboxListTile、RadioListTile、SwitchListTile、Slide。

TextField文本框组件

TextField表单的基本用法

TextField表单常见属性:

属性 描述
maxLines 设置此参数可以把文本框改为多行文本框
onChanged 文本框改变的时候触发的事件
onChanged hintText 类似html中的placeholder border 配置文本框边框OutlineInputBorder配合使用 labelText lable的名称 labelStyle 配置lable的样式
obscureText 把文本框框改为密码框
controller controller 结合TextEditingController()可以配置表单默认显示的内容

f1

import 'package:flutter/material.dart';


class FormPage extends StatefulWidget {
  final Map arguments;
  const FormPage({super.key, required this.arguments,});

  @override
  State<FormPage> createState() => _FormPageState();
}

class _FormPageState extends State<FormPage> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print(widget.arguments);
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.arguments['title']),
      ),
      body: ListView(
        padding: const EdgeInsets.all(10.0),
        children: const [
          TextField(),
          SizedBox(height: 10.0),
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder()
            ),
          ),
          SizedBox(height: 10.0),
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '请输入用户名',
            ),
          ),
          SizedBox(height: 10.0),
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '请输入用户名',
              labelText: '用户名',
            ),
          ),
          SizedBox(height: 10.0),
          TextField(
            obscureText: true,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '请输入密码',
              labelText: '密码',
            ),
          ),
          SizedBox(height: 10.0),
          TextField(
            maxLines: 4,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '多行文本框',
              labelText: '多行文本框',
            ),
          ),
          SizedBox(height: 10.0),
          // 带清空按钮的文本框
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '请输入用户名',
              labelText: '用户名',
              suffixIcon: Icon(Icons.close),
            ),
          ),
          SizedBox(height: 10.0),
          // 在文本框前面添加图标
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '请输入用户名',
              labelText: '用户名',
              prefixIcon: Icon(Icons.people),
            ),
          ),
          SizedBox(height: 10.0),
          // 在文本框外面添加图标
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '请输入用户名',
              labelText: '用户名',
              icon: Icon(Icons.people),
            ),
          ),
          SizedBox(height: 10.0),
          // 请输入网址
          TextField(
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              hintText: '请输入网址',
              labelText: '网址',
              prefixText: 'https://',
              prefixIcon: Icon(Icons.web),
              icon: Icon(Icons.web),
            ),
          ),
        ],
      ),
    );
  }
}

获取TextField表单输入的内容

import 'package:flutter/material.dart';

class LoginPage extends StatefulWidget {
  const LoginPage({super.key});

  @override
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  String username = '';
  String password = '';
  @override
  Widget build(BuildContext context) {
    return Scaffold(

        appBar: AppBar(title: const Text('登录'),),
        body: ListView(
          padding: const EdgeInsets.all(10.0),
          children: [
            TextField(
              onChanged: (value) {
                setState(() {
                  username = value;
                });
              },
              decoration: const InputDecoration(
                labelText: '用户名',
                hintText: '请输入用户名',
                prefixIcon: Icon(Icons.person),
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 10.0),
            TextField(
              onChanged: (value) {
                setState(() {
                  password = value;
                });
              },
              obscureText: true,
              decoration: const InputDecoration(
                labelText: '密码',
                hintText: '请输入密码',
                prefixIcon: Icon(Icons.lock),
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 10.0),
            ElevatedButton(
              onPressed: () {
                print('用户名:$username');
                print('密码:$password');
                Navigator.pushNamed(context, '/');
              },
              child: const Text('登录'),
            ),
          ],
        ),
    );
  }
}

TextEditingController 配置初始化值

import 'package:flutter/material.dart';

class LoginPage extends StatefulWidget {
  const LoginPage({super.key});

  @override
  State<LoginPage> createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  late TextEditingController _usernameController;
  late TextEditingController _passwordController;

  String username = '';
  String password = '';

  @override
  void initState() {
    super.initState();
    // 初始化给表单赋值
    _usernameController = TextEditingController.fromValue(
      TextEditingValue(
        text: 'admin',
        selection: TextSelection.fromPosition(
          const TextPosition(
            affinity: TextAffinity.downstream,
            offset: 'admin'.length,
          ),
        ),
      )
    );
    _passwordController = TextEditingController(text: password);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(

        appBar: AppBar(title: const Text('登录'),),
        body: ListView(
          padding: const EdgeInsets.all(10.0),
          children: [
            TextField(
              controller: _usernameController,
              onChanged: (value) {
                setState(() {
                  username = value;
                });
              },
              decoration: const InputDecoration(
                labelText: '用户名',
                hintText: '请输入用户名',
                prefixIcon: Icon(Icons.person),
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 10.0),
            TextField(
              controller: _passwordController,
              onChanged: (value) {
                setState(() {
                  password = value;
                });
              },
              obscureText: true,
              decoration: const InputDecoration(
                labelText: '密码',
                hintText: '请输入密码',
                prefixIcon: Icon(Icons.lock),
                border: OutlineInputBorder(),
              ),
            ),
            const SizedBox(height: 10.0),
            ElevatedButton(
              onPressed: () {
                print('用户名:$username');
                print('密码:$password');
                Navigator.pushNamed(context, '/');
              },
              child: const Text('登录'),
            ),
          ],
        ),
    );
  }
}

Radio单选按钮组

import 'package:flutter/material.dart';

class FormPage extends StatefulWidget {
  final Map arguments;
  const FormPage({
    super.key,
    required this.arguments,
  });

  @override
  State<FormPage> createState() => _FormPageState();
}

class _FormPageState extends State<FormPage> {
  int sex = 1;
  _radioChange(value) {
    setState(() {
      this.sex = value;
    });
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print(widget.arguments);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.arguments['title']),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text('男'),
                Radio(
                  value: 1,
                  groupValue: sex,
                  onChanged: _radioChange,
                ),
                const Text('女'),
                Radio(
                  value: 2,
                  groupValue: sex,
                  onChanged: _radioChange,
                ),
              ],
            ),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[Text("$sex"), Text(sex == 1 ? "男" : "女")],
            ),
          ],
        ));
  }
}

RadioListTile单选按钮组

import 'package:flutter/material.dart';

class FormPage extends StatefulWidget {
  final Map arguments;
  const FormPage({
    super.key,
    required this.arguments,
  });

  @override
  State<FormPage> createState() => _FormPageState();
}

class _FormPageState extends State<FormPage> {
  int sex = 1;
  int flag = 1;
  _radioChange(value) {
    setState(() {
      this.sex = value;
    });
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print(widget.arguments);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.arguments['title']),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            RadioListTile(
              title: const Text('已完成'),
              value: 1, 
              groupValue: flag, 
              onChanged: (value) {
                setState(() {
                  flag = value as int;
                });
              },
            ),
            RadioListTile(
              title: const Text('未完成'),
              value: 0, 
              groupValue: flag, 
              onChanged: (value) {
                setState(() {
                  flag = value as int;
                });
              },
            ),
          ],
        ));
  }
}

CheckBox

import 'package:flutter/material.dart';

class FormPage extends StatefulWidget {
  final Map arguments;
  const FormPage({
    super.key,
    required this.arguments,
  });

  @override
  State<FormPage> createState() => _FormPageState();
}

class _FormPageState extends State<FormPage> {
  int sex = 1;
  bool flag = true;
  final List _hobby = [
    {'checked': true, 'title': '吃饭'},
    {'checked': false, 'title': '睡觉'},
    {'checked': true, 'title': '写代码'},
  ];

  List<Widget> _initHobby(){
    List<Widget> tempList = [];
    for(var i = 0; i < _hobby.length; i++){
      tempList.add(
        Row(
          children: [
            Text(_hobby[i]['title']),
            Checkbox(
              value: _hobby[i]['checked'], 
              onChanged: (value){
                setState(() {
                  _hobby[i]['checked'] = value!;
                });
              })
          ],
        )
      );
    }
    return tempList;
  }

  _radioChange(value) {
    setState(() {
      this.sex = value;
    });
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print(widget.arguments);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.arguments['title']),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: _initHobby(),
        ));
  }
}

CheckboxListTile

import 'package:flutter/material.dart';

class FormPage extends StatefulWidget {
  final Map arguments;
  const FormPage({
    super.key,
    required this.arguments,
  });

  @override
  State<FormPage> createState() => _FormPageState();
}

class _FormPageState extends State<FormPage> {
  int sex = 1;
  bool flag = true;
  final List _hobby = [
    {'checked': true, 'title': '吃饭'},
    {'checked': false, 'title': '睡觉'},
    {'checked': true, 'title': '写代码'},
  ];

  List<Widget> _getHobby() {
    List<Widget> tempList = [];
    for (var i = 0; i < _hobby.length; i++) {
      tempList.add(
        CheckboxListTile(
            title: Text(_hobby[i]["title"]),
            value: _hobby[i]["checked"],
            onChanged: (value) {
              setState(() {
                _hobby[i]["checked"] = value;
              });
            }),
      );
    }
    return tempList;
  }

  _radioChange(value) {
    setState(() {
      this.sex = value;
    });
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print(widget.arguments);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.arguments['title']),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: _getHobby(),
        ));
  }
}

Switch

import 'package:flutter/material.dart';

class FormPage extends StatefulWidget {
  final Map arguments;
  const FormPage({
    super.key,
    required this.arguments,
  });

  @override
  State<FormPage> createState() => _FormPageState();
}

class _FormPageState extends State<FormPage> {
  bool flag = true;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    print(widget.arguments);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.arguments['title']),
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Switch(value: flag, onChanged: (value){
              setState(() {
                flag = value;
              });
            }),

          ],
        ));
  }
}

表单综合案例

results matching ""

    No results matching ""