繁体   English   中英

有谁知道如何使用 flutter 实现带有类似于 instagram 的标签的搜索栏?

[英]Does anyone know how to implement a search bar with tabs like that similar to instagram using flutter?

我想知道如何构建一个搜索栏,它将用户搜索输入过滤到组或选项卡中,例如人、标签、地点,就像 instagram 一样,但我不知道该怎么做!

它可能看起来像这样:

import 'package:flutter/material.dart';

main() => runApp(
      MaterialApp(
//          home: Scaffold(
//        body: Container(child: SearchButton()),
          home: Body()),
    );

class Body extends StatefulWidget {
  @override
  _BodyState createState() => _BodyState();
}

class _BodyState extends State<Body> {
  TextEditingController controller;

  @override
  void initState() {
    super.initState();
    controller = TextEditingController();
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 2,
      child: Scaffold(
        appBar: AppBar(
          leading: Icon(Icons.search),
          title: TextField(
            controller: controller,
            cursorColor: Colors.white,
            style: TextStyle(color: Colors.white),
          ),
          bottom: TabBar(tabs: [
            Tab(icon: Icon(Icons.people)),
            Tab(icon: Icon(Icons.location_city)),
          ]),
        ),
        body: TabBarView(children: [Container(), Container()]),
      ),
    );
  }
}

想要的结果: 在此处输入图片说明

代码的结果: 在此处输入图片说明

为此使用 UniqueKey()

脚手架(背景颜色:ColorConstant.colorWhite,身体:容器(高度:大小。高度,孩子:列(孩子:[容器(装饰:BoxDecoration(颜色:ColorConstant.colorWhite,//边框:Border.all(),),孩子:填充(填充:const EdgeInsets.only(底部:15),孩子:列(孩子:[填充(填充:const EdgeInsets.only(顶部:50.0,左侧:15,右侧:15,底部:15),孩子: Stack( clipBehavior: Clip.none, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container( width: 265, decoration: BoxDecoration( borderRadius: BorderRadius.circular(5), color: ColorConstant.colorIntroBG.withOpacity( 0.1), ), child: TextFormField( controller: _searchController, onChanged: (text) { if (text,= null) { setState(() { // callFriendSuggestionListApi(0, text; true); // print("inside" ); // DiscoveryPostTabScreen(text); searchText = text。 // _Controller;animateTo(2); }), } }: style: TextStyle( fontSize, 16: color.ColorConstant,textColor2: fontFam iily, 'HK Medium'): decoration: new InputDecoration( hintText, "Search Friend": isDense, true: // 添加了这个 contentPadding。 EdgeInsets,all(8): hintStyle: TextStyle( fontSize, 16: color.ColorConstant,hintColor: fontFamily, 'HK Medium'): focusedBorder: OutlineInputBorder( borderRadius.BorderRadius,circular(5): borderSide: BorderSide( color.ColorConstant. colorIntroBG.withOpacity(0,1): width.0,1), ): enableBorder: OutlineInputBorder( borderRadius.BorderRadius,circular(5): borderSide: BorderSide( color.ColorConstant.colorIntroBG.withOpacity(0,1): width. 0,1), ): 前缀图标。 图标( Icons,search: // color.ColorConstant,errorIconColor: size, 27, ): suffixIcon: GestureDetector( onTap; () { print("object"), }: child.Icon( Icons,close: color.ColorConstant, colorIntroBG: size, 25, ), ), ), ), ), Text("取消": style: TextStyle( fontFamily, "HK Bold": fontSize, 16: color.ColorConstant,colorIntroBG)), ], ), ] , ), ): SizedBox( 高度, 10, ): 容器( 高度, 30,

                    // height: 50,
                    child: TabBar(
                      controller: _Controller,

                      // controller: _controller,
                      unselectedLabelColor: ColorConstant.colorIntroBG,
                      tabs: [
                        Container(
                          child: Tab(
                            child: Text("Posts",
                                style: TextStyle(
                                    fontFamily: "HK Medium", fontSize: 16)),
                          ),
                        ),
                        Container(
                          child: Tab(
                            child: Text("Friends",
                                style: TextStyle(
                                    fontFamily: "HK Medium", fontSize: 16)),
                          ),
                        ),
                        Container(
                          child: Tab(
                            child: Text("Places",
                                style: TextStyle(
                                    fontFamily: "HK Medium", fontSize: 16)),
                          ),
                        ),
                        Container(
                          child: Tab(
                            child: Text("Tags",
                                style: TextStyle(
                                    fontFamily: "HK Medium", fontSize: 16)),
                          ),
                        ),
                      ],

                      labelPadding: EdgeInsets.symmetric(horizontal: 0.0),
                      labelColor: ColorConstant.colorIntroBG,
                      // indicatorWeight: 5,
                      indicatorColor: ColorConstant.colorBlack,

                      // indicatorSize: TabBarIndicatorSize.label,
                      indicator: UnderlineTabIndicator(
                        borderSide: BorderSide(
                            color: ColorConstant.colorIntroBG, width: 2),

                        // insets: EdgeInsets.fromLTRB(60.0, 0.0, 60.0, 40.0),
                      ),
                    )),
                Container(
                  height: 1,
                  color: ColorConstant.borderColorOTP,
                ),
              ],
            ),
          ),
        ),
        Expanded(
            child: TabBarView(
          controller: _Controller,
          key: UniqueKey(),
          children: [
            DiscoveryPostTabScreen(_searchController.text),
            DiscoveryFriendsScreen(_searchController.text),
            DiscoveryPlacesScreen(_searchController.text),
            DiscoveryTagsScreen(_searchController.text),
          ],
        )),
      ],
    ),
  ),
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM