Как избежать перестроения всех виджетов с помощью setState в flutter

#flutter #dart #flutter-layout

#flutter #dart #flutter-layout

Вопрос:

Я пытаюсь добавить границу к контейнеру, который начинает прокручиваться вниз, и удалить его, если прокрутить обратно наверх.

Я слушаю контроллер прокрутки и устанавливаю состояние с помощью setState(), однако похоже, что весь виджет перестраивается, вы можете увидеть сбой.

Может кто-нибудь помочь, как это исправить? Я добавил комментарии к border и listview для ярлыка:

класс:

 class __ExampleAlertDialogState extends State<_ExampleAlertDialog> {
  ScrollController _scrollController = ScrollController();

  var scrollPos = false;

  @override
  void initState() {
    super.initState();
    _scrollController.addListener(_onScroll);
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.symmetric(vertical: 50, horizontal: 20),
      child: Expanded(
        child: ClipRRect(
          borderRadius: BorderRadius.circular(5),
          child: Material(
            child: Column(
              children: [
                Container(
                  decoration: BoxDecoration(
                      
                      // Adding and removing the border here

                      border: Border(
                          bottom: scrollPos == true
                              ? BorderSide(
                                  color: Theme.of(context).dividerColor)
                              : BorderSide.none)),
                  padding: EdgeInsets.symmetric(vertical: 10, horizontal: 12),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [Icon(Icons.arrow_back), Icon(Icons.refresh)],
                  ),
                ),
                Expanded(

                  // This is the scrollable ListView

                    child: ListView.builder(
                     controller: _scrollController,
                     ...
                ))
              ],
            ),
          ),
        ),
      ),
    );
  }

  void _onScroll() {
    final currentScroll = _scrollController.position.pixels;
    if (currentScroll > 2 amp;amp; scrollPos == false) {
      setState(() {
        scrollPos = true;
      });
    } else if(currentScroll < 2 amp;amp; scrollPos == true) {
      setState(() {
        scrollPos = false;
      });
    }
  }
}
 

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

1. Вы можете перенаправить виджет, который нужно создавать отдельно в классе, или использовать решение для управления состоянием (например, поставщик).

2. надеялся, что это будет проще, но позвольте мне попробовать @MohammedAlfateh

3. именно так это делается в flutter, вы преобразуете его в отдельный автономный виджет с отслеживанием состояния