flutter TextField自帶刪除按鈕添加更多按鈕

要求使用flutter實現(xiàn)如圖textfiled功能
初識flutter歡迎交流肌幽。

image.png
image.png

使用方法:

JJText(
            fieldCallBack: (v) {
              print("Callback ${v}");
            },
            isRightBtn: true,
            rightIcon: Image.asset('images/login/密碼可見.png'),
            icon: Image.asset(
              'images/login/手機.png',
              fit: BoxFit.cover,
            ),
            
            height: 100,
            text: "用戶名",
            onRightBtnClick: () {
              print("點我了");
            },
          ),

以下代碼為組建:

import 'package:flutter/material.dart';

typedef void JJTextFieldCallBack(String content);

class JJText extends StatefulWidget {
  final String text;
  final bool password;
  // 是否有更多按鈕
  final bool isRightBtn;
  // 是否顯示取消按鈕
  bool isShowClean;
  final Object onChanged;
  // 更多按鈕點擊
  final Object onRightBtnClick;
  final int maxLines;
  final double height;
  // 左側(cè)按鈕圖標
  final Widget icon;
  // 右側(cè)更多按鈕圖標
  final Widget rightIcon;

  final JJTextFieldCallBack fieldCallBack;

  JJText({
    Key key,
    this.text = "輸入內(nèi)容",
    this.password = false,
    this.isShowClean = false,
    this.onChanged,
    this.onRightBtnClick,
    this.maxLines = 1,
    this.height = 68,
    this.icon,
    this.rightIcon,
    this.isRightBtn = false,
    this.fieldCallBack,
  }) : super(key: key);

  @override
  _JJTextaState createState() => _JJTextaState();
}

class _JJTextaState extends State<JJText> {
  FocusNode _focusNode = new FocusNode();
  TextEditingController controller = TextEditingController();
  @override
  void initState() {
    super.initState();
    _focusNode.addListener(_focusNodeListener);
  }

  Future<Null> _focusNodeListener() async {
    if (_focusNode.hasFocus) {
      setState(() {
        widget.isShowClean = true;
      });
    } else {
      setState(() {
        widget.isShowClean = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Container(
        child: TextField(
          focusNode: _focusNode,
          controller: controller,
          maxLines: widget.maxLines,
          obscureText: widget.password,
          decoration: InputDecoration(
              icon: widget.icon,
              fillColor: Colors.green,
              suffixIcon: Container(
                child: Row(
                  mainAxisSize: MainAxisSize.min,
                  children: <Widget>[
                    widget.isShowClean
                        ? IconButton(
                            icon: Image.asset('images/login/清除.png'),
                            onPressed: onCancel,
                          )
                        : Text(""),
                    widget.isRightBtn
                        ? IconButton(
                            icon: widget.rightIcon,
                            onPressed: widget.onRightBtnClick,
                          )
                        : Text(""),
                  ],
                ),
              ),
              hintText: widget.text,
              border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(30),
                  borderSide: BorderSide.none)),
          onChanged: (v) {
            widget.fieldCallBack(v);
            // if(v.length == 0){
            //   print("00000000");
            // }
            setState(() {
              widget.isShowClean = v.isNotEmpty;
            });
          },
          onSubmitted: (v) {
            widget.fieldCallBack(v);
            setState(() {
              widget.isShowClean = false;
            });
          },
        ),
        decoration: BoxDecoration(
            border:
                Border(bottom: BorderSide(width: 1, color: Colors.black12))),
      ),
    );
  }

  onCancel() {
    // 保證在組件build的第一幀時才去觸發(fā)取消清空內(nèi)
    WidgetsBinding.instance.addPostFrameCallback((_) => controller.clear());
    setState(() {
      widget.isShowClean = false;
    });
  }
}


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刑赶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嘀倒,更是在濱河造成了極大的恐慌,老刑警劉巖限佩,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊尉,死亡現(xiàn)場離奇詭異,居然都是意外死亡锻狗,警方通過查閱死者的電腦和手機满力,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轻纪,“玉大人油额,你說我怎么就攤上這事】讨悖” “怎么了潦嘶?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長崇众。 經(jīng)常有香客問我衬以,道長缓艳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任看峻,我火速辦了婚禮阶淘,結果婚禮上,老公的妹妹穿的比我還像新娘互妓。我一直安慰自己溪窒,他們只是感情好,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布冯勉。 她就那樣靜靜地躺著澈蚌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灼狰。 梳的紋絲不亂的頭發(fā)上宛瞄,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音交胚,去河邊找鬼份汗。 笑死,一個胖子當著我的面吹牛蝴簇,可吹牛的內(nèi)容都是我干的杯活。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼熬词,長吁一口氣:“原來是場噩夢啊……” “哼旁钧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起互拾,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤歪今,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颜矿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體彤委,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年或衡,在試婚紗的時候發(fā)現(xiàn)自己被綠了焦影。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡封断,死狀恐怖斯辰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坡疼,我是刑警寧澤彬呻,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響闸氮,放射性物質(zhì)發(fā)生泄漏剪况。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一蒲跨、第九天 我趴在偏房一處隱蔽的房頂上張望译断。 院中可真熱鬧,春花似錦或悲、人聲如沸孙咪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翎蹈。三九已至,卻和暖如春男公,著一層夾襖步出監(jiān)牢的瞬間荤堪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工枢赔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澄阳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓糠爬,卻偏偏與公主長得像寇荧,于是被迫代替她去往敵國和親举庶。 傳聞我的和親對象是個殘疾皇子执隧,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354