Как программно расширить SliverAppBar

У меня есть SliverAppBar, который прокручивается вверх для сжатия и прокручивается вниз для расширения.

Я хочу расширить SliverAppBar при переключении BottomNavigationBar.

В текущей ситуации состояние SliverAppBar до переключения сохраняется.

Это мой код. https://gist.github.com/ysknsn/d90a84a180e32de5b0691de874c65d55

Любые советы полезны. Спасибо.


person ysknsn    schedule 08.07.2019    source источник


Ответы (1)


Сделайте то же самое, что и с _1 _...

Поместите его в локальную переменную:

  TabController _tabController;
  ScrollController _scrollController;

  int _selectedIndex = 0;

  @override
  void initState() {
    _tabController = TabController(vsync: this, length: 2);
    _scrollController = ScrollController(keepScrollOffset: true);
    super.initState();
  }

Затем используйте его в своем NestedScrollView`

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: DefaultTabController(

        length: _tabController.length,
        child: NestedScrollView(
          controller: _scrollController,
          key: PageStorageKey(widget.title),
          ...

Затем обновите позицию при нажатии:

  void _onItemTapped(int index) {
    _scrollController.jumpTo(0);
    setState(() {
      _selectedIndex = index;
      _tabController.index = index;
    });
  }
person LgFranco    schedule 08.07.2019
comment
Извините, я не могу использовать jumpTo(0), потому что использую PageStorageKey для хранения позиции прокрутки. - person ysknsn; 08.07.2019
comment
@ysknsn Это неловко. Я просто использовал ваш код и внес изменения, которые написал ... Я протестировал его, и он дал желаемый эффект (в моем коде также есть PageStorageKey). Вы получаете сообщение об ошибке? - person LgFranco; 09.07.2019
comment
Спасибо за тестирование. Извините за отсутствие объяснения. Ошибки не было, но он не может удерживать позицию прокрутки. Прокрутите левую вкладку вниз до Left: 100, переключитесь на правую вкладку и переключитесь на левую вкладку. В этом состоянии я хочу, чтобы он оставался как Left: 100, но результат - Left: 0. - person ysknsn; 10.07.2019
comment
Так что вам понадобится рефакторинг вашего кода. У вас есть только один ScrollView, общий для двух вкладок (вкладки являются дочерними элементами scrollView). Вам понадобится по одному свитку для каждой вкладки. И контроллер для каждого. - person LgFranco; 11.07.2019
comment
При использовании NestedScrollView кажется, что вы не можете установить ScrollController для дочернего ScrollView. Поскольку на этот раз эта реализация кажется сложной, я решил отказаться. Спасибо за помощь. - person ysknsn; 14.07.2019