在日常的前端开发中,经常要显示下图中的标签栏:

之前我们学过使用Row,Column来拼出这样的标签栏,其实Flutter提供了标准的组件来完成这项功能,那就是ListTile.

ListTile

一起来看一下ListTile组件中经常用的属性:

ListTile ListTile({
  Key? key,
  Widget? leading,
  Widget? title,
  Widget? subtitle,
  Widget? trailing,
  bool isThreeLine = false,
  bool? dense,
  VisualDensity? visualDensity,
  ShapeBorder? shape,
  ListTileStyle? style,
  Color? selectedColor,
  Color? iconColor,
  Color? textColor,
  EdgeInsetsGeometry? contentPadding,
  bool enabled = true,
  void Function()? onTap,
  void Function()? onLongPress,
  MouseCursor? mouseCursor,
  bool selected = false,
  Color? focusColor,
  Color? hoverColor,
  FocusNode? focusNode,
  bool autofocus = false,
  Color? tileColor,
  Color? selectedTileColor,
  bool? enableFeedback,
  double? horizontalTitleGap,
  double? minVerticalPadding,
  double? minLeadingWidth,
})

leading:对应上图中的1号位置。

title:对应上图中的2号位置。

subtitle:对应上图中的3号位置。

trailing:对应上图中的4号位置。

可以看到这4个属性传入的类型是Widget,这样就标签栏就可以很灵活的显示各种组件。

onTap:点击触发的回调函数。

onLongPress:长按触发的回调函数。

random_password.dart

接下来,我们来修改random_password中的组件,例如_switchLowercase函数,修改为:

Widget _switchLowercase() {
    return ListTile(
      title: Text(
        'lowercaseLetter'.tr,
        style: TextStyle(fontSize: 17),
      ),
      trailing: Switch(
        value: _lowercase,
        onChanged: (value) {
          setState(() {
            _lowercase = value;
          });
        },
      ),
    );
  }

其他_switchUppercase、_switchNumber、_switchSpecial函数以此类推。

但是修改_textLength函数时要注意,不能直接把TextField放到trailing中,因为TextField的宽度默认比trailing大

所以如果要把TextField放到trailing中的时候,应用用SizeBox包裹一层:

SizedBox(
	width: 100,
	child: TextField(
	  controller: TextEditingController(text: _length),
	  textAlign: TextAlign.center,
	  decoration: InputDecoration(
		hintText: 'Enter length',
	  ),
	  keyboardType: TextInputType.number,
	  inputFormatters: [
		FilteringTextInputFormatter.digitsOnly,
		LengthLimitingTextInputFormatter(2)
	  ],
	  onChanged: (text) {
		_length = text;
	  },
	),
),

或者可以采用leading和title来达到目的:

Widget _textLength() {
	return ListTile(
	  leading: Text(
		'length'.tr,
		style: TextStyle(fontSize: 17),
	  ),
	  title: TextField(
		controller: TextEditingController(text: _length),
		textAlign: TextAlign.center,
		decoration: InputDecoration(
		  hintText: 'Enter length',
		),
		keyboardType: TextInputType.number,
		inputFormatters: [
		  FilteringTextInputFormatter.digitsOnly,
		  LengthLimitingTextInputFormatter(2)
		],
		onChanged: (text) {
		  _length = text;
		},
	  ),
	);
}

0

本文为原创文章,转载请注明出处,欢迎访问作者网站(和而不同)

发表评论

error: Content is protected !!