目录
最近闲着无聊学习了flutter的一下知识,发现flutter和安卓之间,页面开发的方式还是有较大的差异的,众所周知,android的页面开发都是写在xml文件中的,而flutter直接写在代码里(dart文件中),从目前我的认识来看,两者在UI上的“套娃”方式,flutter更能套,简直就是“套中套”啊哈哈。比如今天的手写一个最简单的自定义按钮吧,效果如下图所示

这几个需求还是毕竟常用的,目前没考虑渐变色和图标,具体需求具体改吧
本次demo的代码本身属于练手,相当于flutter的"hello world"(毕竟我才刚了解flutter没几天)。
以下是具体的代码实现:
- import 'package:flutter/material.dart';
-
- class CustomTextButton extends StatefulWidget {
- //按钮的宽度
- final double? width;
- //按钮的长度
- final double? height;
- final String text;
- final double? textSize;
- final Color textColor;
- final Color backgroundColor;
- final Color pressedBackgroundColor;
- final VoidCallback onClick;
- final double borderRadius;
- final Color borderColor;
-
- const CustomTextButton(
- {super.key,
- required this.onClick,
- required this.text,
- this.textSize = 16,
- this.width = double.infinity,
- required this.height,
- this.backgroundColor = Colors.white,
- this.pressedBackgroundColor = Colors.white,
- this.borderRadius = 0.0,
- this.borderColor = Colors.white,
- this.textColor = Colors.black});
-
- @override
- State
createState() => _CustomTextButtonState(); - }
-
- class _CustomTextButtonState extends State<CustomTextButton> {
- bool _isPressed = false;
-
- @override
- Widget build(BuildContext context) {
- return ConstrainedBox(
- constraints:
- BoxConstraints.expand(width: widget.width, height: widget.height),
- child: GestureDetector(
- onTap: () {
- widget.onClick();
- },
- onTapDown: (details) {
- setState(() {
- _isPressed = true;
- });
- },
- onTapUp: (details) {
- setState(() {
- _isPressed = false;
- });
- },
- child: Container(
- alignment: Alignment.center,
- decoration: BoxDecoration(
- color: _isPressed
- ? widget.pressedBackgroundColor
- : widget.backgroundColor,
- borderRadius: BorderRadius.circular(widget.borderRadius),
- border: Border.fromBorderSide(
- BorderSide(width: 1, color: widget.borderColor))),
- child: Text(
- widget.text,
- maxLines: 1,
- overflow: TextOverflow.ellipsis,
- style: TextStyle(
- color: widget.textColor,
- fontSize: widget.textSize,
- fontStyle: FontStyle.normal,
- ),
- ),
- ),
- ),
- );
- }
- }
-
- extension HexColor on Color {
- /// String is in the format "aabbcc" or "ffaabbcc" with an optional leading "#".
- static Color fromHex(String hexString) {
- final buffer = StringBuffer();
- if (hexString.length == 6 || hexString.length == 7) buffer.write('ff');
- buffer.write(hexString.replaceFirst('#', ''));
- return Color(int.parse(buffer.toString(), radix: 16));
- }
-
- }
代码演示,如何使用,这个还是非常简单易懂的,有什么需要改进的地方,也请大佬指示改进。
- Container(
- margin: const EdgeInsets.only(left: 20, right: 20),
- child: CustomTextButton(
- text: '注册',
- textSize: 18,
- textColor: Colors.white,
- backgroundColor: HexColor.fromHex("F9AC00"),
- pressedBackgroundColor: HexColor.fromHex("E0CE32"),
- height: 44,
- borderRadius: 30,
- onClick: () {
- Fluttertoast.showToast(
- msg: "您按了注册",
- toastLength: Toast.LENGTH_SHORT,
- gravity: ToastGravity.BOTTOM,
- timeInSecForIosWeb: 1,
- backgroundColor: Colors.black12,
- textColor: Colors.black,
- fontSize: 14.0);
- },
- ),
- ),