Flutter - изменить анимацию TabBarView - PullRequest
0 голосов
/ 19 октября 2018

Я реализовал базовый TabBar и TabBarView с DeafualtTabController, см. Код ниже.

class MyApp2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: BOTTOM_TABS,
      child: Scaffold(
        appBar: AppBar(title: const Text('Bottom App Bar')),
        body: _tabBarView(),
        bottomNavigationBar: _bottomTabBar(),
      ),
    );
  }

  _tabBarView() {
    return TabBarView(
      physics: NeverScrollableScrollPhysics(),
      children: [
        Container(
          color: Colors.blue,
        ),
        Container(
          color: Colors.orange,
        ),
        Container(
          color: Colors.lightGreen,
        ),
        Container(
          color: Colors.red,
        ),
      ],
    );
  }

  _bottomTabBar() {
    return TabBar(
      tabs: [
        Tab(
          icon: new Icon(Icons.home),
        ),
        Tab(
          icon: new Icon(Icons.public),
        ),
        Tab(
          icon: new Icon(Icons.group),
        ),
        Tab(
          icon: new Icon(Icons.person),
        )
      ],
    );
  }
}

Отлично работает!Теперь я хочу изменить анимацию между двумя вкладками с анимации по умолчанию.Но я не могу найти простой способ сделать это.

После небольшого исследования кажется, что мне нужно использовать пользовательский TabController и каким-то образом использовать его метод animateTo .Мне кажется, это довольно большое изменение, просто чтобы изменить анимацию. Что мне интересно, так это если это правильный путь или я упускаю какой-то более простой способ просто изменить анимацию по умолчанию между вкладками?

Если кто-то может дать мне несколько хороших ресурсов для указанияя в правильном направлении, я очень ценю это.

Ответы [ 2 ]

0 голосов
/ 19 августа 2019

Это не сложно, просто используйте TabController (для этого вам нужно использовать SingleTickerProviderStateMixin) и AnimatedBuilder.

enter image description here

class MyApp2 extends StatefulWidget {
  @override
  _MyApp2State createState() => _MyApp2State();
}

class _MyApp2State extends State<MyApp2> with SingleTickerProviderStateMixin {
  TabController _tabController;

  @override
  void initState() {
    _tabController = TabController(length: 4, vsync: this);
    super.initState();
  }

  _tabBarView() {
    return AnimatedBuilder(
      animation: _tabController.animation,
      builder: (BuildContext context, snapshot) {
        return Transform.rotate(
          angle: _tabController.animation.value * pi,
          child: [
            Container(
              color: Colors.blue,
            ),
            Container(
              color: Colors.orange,
            ),
            Container(
              color: Colors.lightGreen,
            ),
            Container(
              color: Colors.red,
            ),
          ][_tabController.animation.value.round()],
        );
      },
    );
  }

  _bottomTabBar() {
    return TabBar(
      controller: _tabController,
      labelColor: Colors.black,
      tabs: [
        Tab(
          icon: new Icon(Icons.home),
        ),
        Tab(
          icon: new Icon(Icons.public),
        ),
        Tab(
          icon: new Icon(Icons.group),
        ),
        Tab(
          icon: new Icon(Icons.person),
        )
      ],
    );
  }

  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 4,
      child: Scaffold(
        appBar: AppBar(title: const Text('Bottom App Bar')),
        body: _tabBarView(),
        bottomNavigationBar: _bottomTabBar(),
      ),
    );
  }
}
0 голосов
/ 04 июня 2019

Я не знаю, хотите ли вы полностью изменить анимацию.

Но если вам просто нужна некоторая настройка, вы пытались использовать TabController вместо DefaultTabController?Вам просто нужно передать tabController в качестве аргумента TabBar & TabBarView.

Чтобы настроить анимацию с помощью tabController, вы должны указать анимацию для tabController, а такжезадайте кривую и продолжительность с помощью функции animateTo tabController.

https://api.flutter.dev/flutter/material/TabController/animateTo.html https://api.flutter.dev/flutter/material/TabController-class.html

...