iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0
Mobile Development

Flutter App 開發實戰系列 第 17

來做個使用者列表吧 | TextField 搜尋 [DAY 17]

  • 分享至 

  • xImage
  •  

在使用者列表中我們有放入一個 TextField,目的是讓我們可以搜尋使用者的名稱,今天我們就要來完善搜尋的功能
建議先看 -> 來做個使用者列表吧[DAY 15]
會有比較完整的 UI


新增幾個會用到的參數

class UserListPageState extends State<UserListPage> {
   final menuItems = ["一般" , "車格管理員" ,"管理員" ,"最近使用"];
   List<User> users = [] ;
+  List<User> searchResult = [] ; // 收尋的資料會放到這裡
+  final TextEditingController _controller = new TextEditingController();
+  bool _isSearching = false ; //判斷是否正在收尋

+  UserListPageState(){ //controller 增加監聽 來開啟或關閉收尋狀態
    _controller.addListener(() {
      if(_controller.text.isEmpty){
        setState((){
          _isSearching = false ;
          _searchText = ""  ;
        });
      }else{
        setState((){
          _isSearching = true ;
          _searchText = _controller.text  ;
        });
      }
    });
  }

收尋的功能,判斷文字內容是否包含收尋的內容
再將 user 加入到result list 中

 void searchOperation(String searchText) {
    searchResult.clear();

    for (int i = 0; i < users.length; i++) {
      String data = users[i].name ;
      if (data.toLowerCase().contains(searchText.toLowerCase())) {
        searchResult.add(users[i]);
      }
    }

  }

Search Field 設定

    final searchField = TextField(
 +   controller: _controller,
 +   onChanged: searchOperation,
      decoration: InputDecoration(
          prefixIcon: Icon(Icons.search),
          hintText: 'Search...'),

    );

新增 listView 來顯示收尋的內容

    final listBuilder = ListView.builder(
      itemCount: users.length,
      itemBuilder: (context,index){
        return ListTile(
          leading: getImageView(index),
          title: Text("${users[index].name}"),
          subtitle: Text("Last Use : ${users[index].lastUse}"),
        );
      },
    );

+   final searchListBuilder = ListView.builder(
      itemCount: searchResult.length,
      itemBuilder: (context,index){
        return ListTile(
          leading: getImageView(index),
          title: Text("${searchResult[index].name}"),
          subtitle: Text("Last Use : ${searchResult[index].lastUse}"),
        );
      },
    );

組合

  return Column(

      mainAxisSize: MainAxisSize.max,
      mainAxisAlignment: MainAxisAlignment.start,
      children: <Widget>[
        Expanded(
          child: Row(
            mainAxisSize: MainAxisSize.max,
            children: <Widget>[
              Expanded(child: searchField,),
              dropDownBtn,

            ],
          ),flex:1,),
        Expanded(
          flex: 8,
          //判斷狀態來顯示不同的 listView
+         child: _isSearching ?  searchListBuilder:listBuilder ,
        )
      ],
    );

完成範例
https://ithelp.ithome.com.tw/upload/images/20200917/20130127FY2CtIJ77U.png


上一篇
來做個使用者列表吧[DAY 16]
下一篇
Flutter Dialog 介紹 [DAY 18]
系列文
Flutter App 開發實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言