Вопросы об исходном коде Flutter TabbarView

#flutter

Вопрос:

Метод _warpToCurrentIndex в TabBarViewState включает обработку (_currentIndex-предыдущий индекс).abs()> 1, но зачем с ним нужно иметь дело? Я не вижу, какую проблему нужно решать.

Я думаю, что достаточно непосредственно выполнить следующую обработку

 _pageController.animateToPage(
             _currentIndex, duration: kTabScrollDuration, curve: Curves.ease);
 

Зачем вам нужны атрибуты _childrenWithKey и _childrenWithKey? Почему вам нужно сначала прыгать, а затем анимировать изображение:

_pageController.jumpToPage(начальная страница); ожидание _pageController.animateToPage(_currentIndex, длительность: kTabScrollDuration, кривая: Кривые.простота);

 Future<void> _warpToCurrentIndex() async {
    if (!mounted)
      return Future<void>.value();

    if (_pageController.page == _currentIndex.toDouble())
      return Future<void>.value();

    final int previousIndex = _controller.previousIndex;
    if ((_currentIndex - previousIndex).abs() == 1)
      return _pageController.animateToPage(_currentIndex, duration: kTabScrollDuration, curve: Curves.ease);

   ////Why need special handling (_currentIndex-previousIndex).abs()> 1 
    assert((_currentIndex - previousIndex).abs() > 1);
    final int initialPage = _currentIndex > previousIndex
        ? _currentIndex - 1
        : _currentIndex   1;
    final List<Widget> originalChildren = _childrenWithKey;
    setState(() {
      _warpUnderwayCount  = 1;

      _childrenWithKey = List<Widget>.from(_childrenWithKey, growable: false);
      final Widget temp = _childrenWithKey[initialPage];
      _childrenWithKey[initialPage] = _childrenWithKey[previousIndex];
      _childrenWithKey[previousIndex] = temp;
    });
    _pageController.jumpToPage(initialPage);

    await _pageController.animateToPage(_currentIndex, duration: kTabScrollDuration, curve: Curves.ease);
    if (!mounted)
      return Future<void>.value();
    setState(() {
      _warpUnderwayCount -= 1;
      if (widget.children != _children) {
        _updateChildren();
      } else {
        _childrenWithKey = originalChildren;
      }
    });
  }