Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >输入和选择

输入和选择

作者头像
flyou
发布于 2019-08-06 09:07:19
发布于 2019-08-06 09:07:19
2.6K00
代码可运行
举报
文章被收录于专栏:flutter开发者flutter开发者
运行总次数:0
代码可运行

在前面的文章中我们学习了Flutter中事件的处理,包括组件的单击、双击、长按、滑动等。想必大家多其已经有了一定的认识。

那么,这节我们主要介绍下Flutter中输入和选择组件的用法。

TextField

顾名思义文本输入框,类似于Ios中的UITextField和Android中的EditText。主要是为用户提供输入文本提供方便。相信大家在原生客户端上都用过这个功能,就不在做具体介绍了,接下来还是具体介绍下Flutter中TextField的用法。

TextField的构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const TextField({
Key key,
this.controller,//控制器,控制TextField文字
this.focusNode,
this.decoration: const InputDecoration(),//输入器装饰
TextInputType keyboardType: TextInputType.text,//输入的类型
this.style,
this.textAlign: TextAlign.start,//对齐方式
this.autofocus: false,
this.obscureText: false,//是否隐藏输入
this.autocorrect: true,
this.maxLines: 1,
this.maxLength,
this.maxLengthEnforced: true,
this.onChanged,//文字改变触发
this.onSubmitted,//文字提交触发(键盘按键)
this.inputFormatters,
})

先来试试最基本的TextField

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("TextField"),
        ),
        body: new TextField());
  }
}

看下效果

我们增加一个keyboardType属性,把keyboardType设置为TextInputType.number

可以看到每次我们让TextField获得焦点的时候弹出的键盘就变成了数字优先了。

当然,我们也可以为输入框做一些其他的效果,如提示文字,icon、标签文字等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
new TextField(keyboardType: TextInputType.number,
decoration: new InputDecoration(
contentPadding: const EdgeInsets.only(top: 10.0),
icon: new Icon(Icons.phone),
labelText: "请输入你的手机号",
helperText: "注册时填写的手机号码"),
autofocus: false,
))

看下效果

我们给上面的代码新增decoration属性,可以发现当我们的TextField获得焦点时,图标会自动变色,提示文字会自动上移。

接下来,我们来看下onChanged和onSubmitted。onChanged是每次输入框内每次文字变更触发的回调,onSubmitted是用户提交而触发的回调。

在前面代码的基础上新增如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
onChanged: (String str){

print("用户输入变更:$str");
},
onSubmitted: (String str){
print("用户提交:$str");
},

每当用户改变输入框内的文字,都会在控制台输出现在的字符串 当用户点击提交按钮(输入法回车键)

再来看下效果:

控制台输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
I/flutter (31747): 用户输入变更:1
I/flutter (31747): 用户输入变更:12
I/flutter (31747): 用户输入变更:123
I/flutter (31747): 用户输入变更:1234
I/flutter (31747): 用户输入变更:12345
I/flutter (31747): 用户输入变更:123456
I/flutter (31747): 用户提交:123456

看了这么多的基础用法,我们还是来看个例子把。

当用户输入 用户名flyou,密码是admin时,提示登录成功,当用户名密码不是此值时提示登录失败。

在这里,我们需要简单介绍下SnackBar

使用 Scaffold.of(context).showSnackBar()即可显示SnackBar,大家在这里不需要了解太多,以后会具体介绍的。

我们还是来看下具体的代码吧:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
//用户名输入框的控制器
  TextEditingController _userNameController = new TextEditingController();
//密码输入框的控制器  
  TextEditingController _userPasswordController = new TextEditingController();

  void onTextClear() {
    setState(() {
      _userNameController.text = "";
      _userPasswordController.text = "";
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Text("TextField"),
        ),
        body: new Column(
          children: <Widget>[
            new TextField(
              controller: _userNameController,
              decoration: new InputDecoration(
                  contentPadding: const EdgeInsets.only(top: 10.0),
                  icon: new Icon(Icons.perm_identity),
                  labelText: "请输入用户名",
                  helperText: "注册时填写的名字"),
            ),
            new TextField(
              controller: _userPasswordController,
              decoration: new InputDecoration(
                  contentPadding: const EdgeInsets.only(top: 10.0),
                  icon: new Icon(Icons.lock),
                  labelText: "请输入密码",
                  helperText: "登录密码"),
              obscureText: true,
            ),
            new Builder(builder: (BuildContext context) {
              //监听RaisedButton的点击事件,并做相应的处理
              return new RaisedButton(
                  onPressed: () {
                    if (_userNameController.text.toString() == 'flyou' &&
                        _userPasswordController.text.toString() == 'admin') {
                      Scaffold.of(context).showSnackBar(
                          new SnackBar(content: new Text("登录成功")));
                    } else {
                      Scaffold.of(context).showSnackBar(
                          new SnackBar(content: new Text("登录失败,用户名密码有误")));
                    }
                    onTextClear();
                  },
                  color: Colors.blue,
                  highlightColor: Colors.lightBlueAccent,
                  disabledColor: Colors.lightBlueAccent,
                  child: new Text(
                    "登录",
                    style: new TextStyle(color: Colors.white),
                  ));
            })
          ],
        ));
  }
}

在布局上,我们使用一个Column包含了两个TextField和一个RaisedButton。

在逻辑上,每当我们点击下面的按钮都会判断用户名密码是否是flyou和admin,并且使用控制器清空已经输入的用户名和密码。

如果用户输入的用户名等于flyou,密码等于admin则提示“登录成功”,否则提示“登录失败,用户名密码有误”。

代码的逻辑很简单,结合前面的StatefulWidget的用法,看起来也是非常简单的。关于TextField的其他用法就不在一一介绍了,有兴趣的小伙伴可以自己尝试下。

下面我们来你看下Checkbox

Checkbox

Checkbox,没错就是我们常用的复选框,具体的用法也很简单的

构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Checkbox({
Key key,
@required this.value,//当前值,是否选中
@required this.onChanged,//选中变更监听
this.activeColor,//选中时的颜色
})

直接看代码看用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  var _isChecked = true;
  onCheckChange(bool isChecked) {
    setState(() {
      _isChecked = isChecked;
    });
  }
  @override
  Widget build(BuildContext context) {

    return new Scaffold(
      appBar: new AppBar(
        title: new Text("CheckBox"),
      ),
      body: new Center(
        child: new Checkbox(value: _isChecked, onChanged: onCheckChange),
      ),
    );
  }
}

我们在屏幕的正中央放置了一个Checkbox,每当用户点击时就变更选中的状态。

代码很简单,不再做具体介绍了

Radio

没错Radio就是我们常用的单选框的意思,通常Radio都是成组出现的,在一组Radio中,只能有一个选中的。

构造方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Radio({
Key key,
@required this.value,
@required this.groupValue,
@required this.onChanged,
this.activeColor
})

构造方法和上面的Checkbox基本类似,只不过比上面的Checkbox多了一个groupValue参数,当然这个参数就是用来控制分组的。

还是来看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {

  int radioValue=0;

  void handleRadioValueChanged(int value) {
    setState(() {
      radioValue = value;
    });
  }
  @override
  Widget build(BuildContext context) {

    return new Scaffold(
      appBar: new AppBar(
        title: new Text("CheckBox"),
      ),
      body: new Center(
          child: new Column(
            children: <Widget>[
              new Radio(
                  value: 0,
                  groupValue: radioValue,
                  onChanged:  handleRadioValueChanged),
              new Radio(
                  value: 1,
                  groupValue:radioValue,
                  onChanged: handleRadioValueChanged),
              new Radio(
                  value: 2,
                  groupValue: radioValue,
                  onChanged: handleRadioValueChanged),
              new Radio(
                  value: 3,
                  groupValue: radioValue,
                  onChanged: handleRadioValueChanged)
            ],
          )),
    );
  }
}

我们在Column放了4个Radio,每当点击Radio都会触发handleRadioValueChanged方法来更改当前选中的Radio并且更新选中状态。

看下效果:

Switch

Switch翻译过来就是开关的意思,就是控制开关。和Ios和Android中的Switch组件类似

构造方法如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Switch({
Key key,
@required this.value,
@required this.onChanged,
this.activeColor,
this.activeTrackColor,
this.inactiveThumbColor,
this.inactiveTrackColor,
this.activeThumbImage,
this.inactiveThumbImage
})

已经很简单,只不过多了几个参数用来控制打开和关闭时的颜色或者图片。

还是来看下基本的用法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  var _isChecked = true;

  onSwitchChange(bool isChecked) {
    setState(() {
      print(isChecked);
      _isChecked = isChecked;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Switch"),
      ),
      body: new Center(
        child: new Switch(value: _isChecked, onChanged: onSwitchChange),
      ),
    );
  }
}

看了上面的代码是不是觉得跟CheckBox基本上一模一样呢?

Slider

Slider滑块组件,也类似于进度条组件,用法依旧很简单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Slider({
Key key,
@required this.value,
@required this.onChanged,
this.min: 0.0,//最小值
this.max: 1.0,//最小值
this.divisions,
this.label,//标志
this.activeColor,
this.inactiveColor,
this.thumbOpenAtMin: false,
})

由于很简单就直接给大家看代码了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  double currentPosition = 66.0;


  onSliderChange(double position) {
    setState(() {
      print(position);
      currentPosition = position;

    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Slider"),
      ),
      body: new Center(
        child: new Slider(
          label: "进度",
          min: 0.0,
          max: 100.0,
          value: currentPosition,
          onChanged: onSliderChange,
        ),
      ),
    );
  }
}

我们设置slider的默认进度为66,每当用户滑动滑块时根据用户的滑动改变滑块的位置。

更多相关Widget

在上面我们分别介绍了,CheckBox、Radio、Switch、的用法,但是这些组件一般不是单独使用的,一般会和Text、Icon或者其他的Widget结合使用。

当然Flutter中为我们内置了多个相关的Widget,例如:

CheckboxListTile、RadioListTile、SwitchListTile,当然这些Widget的用法类似于前面我们说过的ListTitle,只不过在多了一个上面的Widget而已,当然用法也是非常简单的。

我们来看下CheckboxListTile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import 'package:flutter/material.dart';

void main() {
  runApp(new MaterialApp(
    home: new MyApp(),
  ));
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return new MyAppState();
  }
}

class MyAppState extends State<MyApp> {
  var _isChecked = true;

  onCheckChange(bool isChecked) {
    setState(() {
      print(isChecked);
      _isChecked = isChecked;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("CheckedBoxListTitle"),
      ),
      body: new CheckboxListTile(
        value: _isChecked,
        onChanged: onCheckChange,
        secondary: new Icon(Icons.update,color: Colors.blueAccent,),
        title: new Text("新版本自动下载"),
        subtitle: new Text("仅在WiFi环境下生效"),

      ),
    );
  }
}

同样的每当我们点击CheckBox或者这个CheckboxListTile都会触发CheckBox的相应操作,去改变Checkbox的状态。

RadioListTile和SwitchListTile的用法基本相同,这里就不在具体介绍了,大家可以在下面试一下如何使用。

小结

  • 可以根据TextField的相关属性来完成特定的输入需求
  • CheckBox、Radio、Switch是开发中常用的选择组件
  • Slider滑块组件,可以满足用户对进度的精确控制
  • CheckboxListTile、RadioListTile和SwitchListTile是对相应组件的封装

试一试

根据我们以前学过的东东完成下图效果

最近大家都在说公众号上阅读不方便,会把文章同步到网站上(http://flutter.link),点击阅读原文即可查看。

当然,有什么问题也欢迎大家在后台留言,我会在看到的第一时间回复大家的

我怀疑这个是个坏掉的二维码,分享到朋友圈试试?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 flutter开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter中的操作提示
在前面的文章中我们学习了Flutter中输入以及选择控件的用法,借助于这些组件大家可以完成很多常用的功能,但是他不能及时在用户操作后完成相应的界面提示,所以今天我们就会来看下Flutter中的操作提示。
flyou
2019/08/06
2.2K0
Flutter中的操作提示
Flutter中的常见表单组件
在Flutter中,常见的表单组件有TextField单行文本框、TextField多行文本框、CheckBox、Radio、Switch、CheckBoxListTile、RadioListTile、SwitchListTile、Slide等。
拉维
2019/08/29
5.1K0
Flutter中的常见表单组件
『Flutter』有无状态组件
说一下背景,就是我们在编写 Flutter 程序的时候,我们目前是将所有的代码都编写在一个文件中,现在代码量比较少所以看上去还好,但是当代码量比较大的时候,这样的代码就会显得非常的臃肿,不利于我们的维护。
杨不易呀
2024/01/17
4313
『Flutter』有无状态组件
《Flutter》-- 4.Flutter组件基础
Flutter开发中有一个非常重要的理念,即一切皆为组件。Flutter中Widget不仅可以表示UI元素,也可以布局元素、动画、装饰效果。
爱学习的程序媛
2022/04/07
12.8K0
《Flutter》-- 4.Flutter组件基础
第130期:flutter的状态组件和状态管理
怎样才能在我们的flutter应用中对用户输入做出响应?比如我们有个图标,我们想让它支持点击事件,或者在状态改变的时候换一个不同的图标。
terrence386
2023/02/25
1.6K0
第130期:flutter的状态组件和状态管理
Flutter入门(五)
国际化方案http://bbs.itying.com/topic/5cfb2a12f322340b2c90e764
用户3112896
2019/12/30
9790
Flutter中的路由与跳转
在前一篇的文章我们学习了ListView和GridView的用法,我们可以使用new 方式和ListView.builder()、ListView.custom()的方式来构建这两个Widget,使用ListVIew和GridView可以帮助我们快速构建多Item视图。
flyou
2019/08/06
1.6K0
Flutter中的路由与跳转
[Flutter Widget]ExpansionPanelList
在前面的文章中我们介绍了可以展开的带标题控件ExpansionTile的用法,在文章的最后还是按照惯例给大家留下了一个问题。
flyou
2018/10/16
4.1K0
ListView&GirdView
在前面的的文章中我们了解了Flutter中操作提示的用法,包括SnackBar、Dialog、以及BottomSheet,通过这些Widget我们可以很方便的实现对应用操作的提示。
flyou
2019/08/06
1.8K0
ListView&GirdView
Flutter:使用复选框进行下拉多选
本文向您展示了在 Flutter 中使用复选框实现下拉多选的两种不同方法。在第一种方法中,我们将从头开始构建多选。在第二种方法中,我们将使用第三方包快速完成工作。
徐建国
2022/03/30
3.5K0
Flutter:使用复选框进行下拉多选
Flutter组件随笔练习
Container组件 import 'package:flutter/material.dart'; //快捷方式:fim void main() { runApp(MyApp()); } //自定义组件 class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { // TODO: implement build return MaterialApp(
明知山
2020/09/02
9970
Flutter之旅:认识Widget(源码级)
1.Widget的第一印象 1.1:初次的见面 首先我们来到第一次看到Widget类的场景,那时还对这个世界一无所知, 进入程序的入口时runApp函数中需要传入一个Widget对象,这便是第一眼。 初始项目中的做法是自定义了一个MyApp类继承自StatelessWidget。 void main()=>runApp(MyApp()); ---->[flutter/lib/src/widgets/binding.dart:778]---- void runApp(Widget app) {
张风捷特烈
2020/04/30
1.4K0
Flutter之旅:认识Widget(源码级)
[Flutter Widget]ExpansionTile
在前面的文章红我们学习了Chip的用法,使用Chip可以很方便的完成对想要的东西打上想要的标签。在文章的最后让大家实现如下的效果
flyou
2018/10/16
2.3K0
使用Provider来进行状态管理
当我们想在多个页面(组件/Widget)之间共享状态(数据),或者一个页面(组件/WIdget)的多个子组件之间共享状态(数据),这个时候我们就需要用Flutter中的状态管理来管理统一的状态(数据),实现不同组件间直接的传值和数据共享。
拉维
2019/10/14
2.2K0
使用Provider来进行状态管理
【Flutter 组件】005-基础组件:单选、开关和复选框
Material 组件库中提供了 Material 风格的单选开关 Switch 和复选框 Checkbox,虽然它们都是继承自 StatefulWidget,但它们本身不会保存当前选中状态,选中状态都是由父组件来管理的。当Switch或Checkbox被点击时,会触发它们的onChanged回调,我们可以在此回调中处理选中状态改变逻辑。
訾博ZiBo
2025/01/06
3670
【Flutter 组件】005-基础组件:单选、开关和复选框
Flutter中表单组件综合运用实例
前面介绍了Flutter的各个表单组件的运用,现将这些组件用来实现一个综合练习。 实现的效果图如下: 以下是代码实现,供大家参考: import 'package:flutter/material.d
越陌度阡
2021/01/05
5410
Flutter中表单组件综合运用实例
Flutter布局基础——自定义BottomNavigationBar
这里我们来尝试实现一个不规则的 BottomNavigationBar,首先了解两个系统组件: floatingActionButton和BottomAppBar
莫空9081
2021/08/19
2.2K0
为Flutter应用程序添加交互性 顶
你如何修改你的应用程序,使其对用户输入做出反应? 在本教程中,您将为仅包含非交互式小部件的应用添加交互性。 具体来说,您将通过创建一个管理两个无状态小部件的自定义状态小部件来修改图标以使其可以点击。
南郭先生
2018/08/14
4.4K0
为Flutter应用程序添加交互性
                                                    顶
Flutter入门指南
笔者项目中使用Flutter的模块并不多。虽然笔者还没有机会在项目中正式使用Flutter,但是也在学习Flutter的一些基本用法。本文就是一篇Flutter的入门介绍,后续会写更多深入介绍的文章。Flutter可以通过一套代码库快速构建高质量、高性能的跨平台应用,支持iOS、Android、Web以及桌面平台。在本文中,我们将介绍如何入门Flutter,包括环境搭建、基本概念、常用组件以及示例代码。
陆业聪
2024/07/23
2330
Flutter入门指南
Flutter:创建透明/半透明的应用栏
如果您希望 body 的高度扩展到包含应用栏的高度并且 body 的顶部与应用栏的顶部对齐,则必须将Scaffold小部件的extendBodyBehindAppBar属性设置为true(默认值为false )。
徐建国
2022/06/24
3.6K0
Flutter:创建透明/半透明的应用栏
相关推荐
Flutter中的操作提示
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验