Как закрепить текстовое поле в SliverAppBar при прокрутке в Flutter?

#flutter #flutter-sliverappbar

Вопрос:

SliverAppBar содержит поле поиска по текстовому полю, но при прокрутке оно прокручивается вверх. Как отобразить окно поиска при прокрутке. Я делал свои собственные работы, но не работал. Если есть какой-либо ресурс о Sliverappbar и Slivergrid, он также полезен. Но теперь, как закрепить текстовое поле панели приложений?

 SliverAppBar(
      //snap: true,
      stretch: true,
      //floating: true,
      title: Text('Home'),
      centerTitle: true,
      expandedHeight: 100.0,
      backgroundColor: Colors.red,
      leading: IconButton(
        icon: Icon(
          Icons.menu,
          color: Colors.white,
        ),
        onPressed: () {},
      ),
      actions: [
        IconButton(
          icon: Icon(
            Icons.notifications,
            color: Colors.white,
          ),
          onPressed: () {},
        ),
      ],
      //floating: false,
      pinned: true,
      flexibleSpace: ListView(
        children: [
          SizedBox(
            height: 40.0,
          ),
          Padding(
            padding: const EdgeInsets.only(
              top: 12.0,
              bottom: 12.0,
              left: 8.0,
              right: 8.0,
            ),
            child: Container(
              height: 40,
              decoration: BoxDecoration(
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(5.0)),
              child: TextField(
                decoration: InputDecoration(
                  labelText: "Search products...",
                  border: InputBorder.none,
                  icon: IconButton(onPressed: () {}, icon: Icon(Icons.search)),
                ),
              ),
            ),
          ),
        ],
      ),
    );


 

Ответ №1:

flexibleSpace был разработан для этой цели эффекта прокрутки, он будет уменьшаться в зависимости от прокрутки. Тем не менее, вы можете получить пользовательский интерфейс вашего желания, используя title вот демонстрационную версию

  SliverAppBar(
            //snap: true,
            stretch: true,
            //floating: true,
            toolbarHeight: 100.0   kToolbarHeight,

            /// based on your desing
            title: Column(
              children: [
                Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: [
                    IconButton(
                      icon: Icon(
                        Icons.menu,
                        color: Colors.white,
                      ),
                      onPressed: () {},
                    ),
                    Text('Home'),
                    IconButton(
                      icon: Icon(
                        Icons.notifications,
                        color: Colors.white,
                      ),
                      onPressed: () {},
                    ),
                  ],
                ),
                Padding(
                  padding: const EdgeInsets.only(
                    top: 12.0,
                    bottom: 12.0,
                    left: 8.0,
                    right: 8.0,
                  ),
                  child: Container(
                    height: 40,
                    decoration: BoxDecoration(
                        color: Colors.white,
                        borderRadius: BorderRadius.circular(5.0)),
                    child: TextField(
                      decoration: InputDecoration(
                        labelText: "Search products...",
                        border: InputBorder.none,
                        icon: IconButton(
                            onPressed: () {}, icon: Icon(Icons.search)),
                      ),
                    ),
                  ),
                ),
              ],
            ),

            centerTitle: true,
            // expandedHeight: 100.0,
            backgroundColor: Colors.red,
            // leading: IconButton(
            //   icon: Icon(
            //     Icons.menu,
            //     color: Colors.white,
            //   ),
            //   onPressed: () {},
            // ),
            // actions: [

            // ],
            //floating: false,
            pinned: true,
          ),
 

Это решает ваш вопрос?

Комментарии:

1. Чтобы получить правильный пользовательский интерфейс, я бы предпочел использовать Row его путем замены leading и actions иметь больший контроль над пользовательским интерфейсом.

2. Спасибо, я проверю и переиграю.

3. Это почти получилось, но заголовок панели приложений и значки не выровнены вверху.

4. Текстовое поле работает нормально. но заголовок панели приложений отображается вверху, значки действий под ним.

5. Как я уже упоминал ранее, нам нужно использовать replace leading и actions with row, я обновил ответ.