禁用Tab单击事件上的TabView动画?

时间:2018-07-03 16:17:54

标签: flutter

TabView中的Tab单击时如何禁用TabBar动画? 我添加了

physics: NeverScrollableScrollPhysics()

用于TabView,但不适用于TabBar。

我正在使用DefaultTabController

3 个答案:

答案 0 :(得分:0)

我认为没有办法禁用TabBarView上的过渡动画。解决方法是,您可以使用Container来返回不同的页面,具体取决于所选的标签。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  @override
  void initState() {
    super.initState();
    tabController = TabController(length: 4, vsync: this);
  }

  var _homeScaffoldKey = Key("Scaffold Key");
  var tabController;
  var currentPage = 0;

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: _homeScaffoldKey,
      body: _getCustomContainer(),
      bottomNavigationBar: new Material(
        color: Colors.blue,
        child: new TabBar(
          isScrollable: true,
          indicatorColor: Color.fromRGBO(255, 25, 255, 0.0),
          controller: tabController,
          onTap: (value) {
            setState(() {
              currentPage = value;
            });
          },
          tabs: <Widget>[
            new Tab(
              icon: new Icon(Icons.accessibility),
            ),
            new Tab(
              icon: new Icon(Icons.accessibility),
            ),
            new Tab(
              icon: new Icon(Icons.accessibility),
            ),
            new Tab(
              icon: new Icon(Icons.accessibility),
            ),
          ],
        ),
      ),
    );
  }

  _getCustomContainer() {
    switch (currentPage) {
      case 0:
        return page1();
      case 1:
        return page2();
      case 2:
        return page3();
      case 3:
        return page4();
    }
  }

  page1() => Container(
        color: Colors.redAccent,
        child: Center(
          child: Text("Page 1"),
        ),
      );
  page2() => Container(
        color: Colors.greenAccent,
        child: Center(
          child: Text("Page 2"),
        ),
      );
  page3() => Container(
        color: Colors.blueAccent,
        child: Center(
          child: Text("Page 3"),
        ),
      );
  page4() => Container(
        color: Colors.yellowAccent,
        child: Center(
          child: Text("Page 4"),
        ),
      );
}

演示

demo

答案 1 :(得分:0)

基于 a very good answer on github about this issue,它实现了类似于您所寻找的东西(但带有 bottomNavigationBar),我在这里与您分享另一种解决方法。它由一个 DefaultTabController 与一个 PageView、一个 PageController 和一个简单的索引组合而成。试试这个。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Tabs with no animation',
      theme: ThemeData.dark(),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  PageController _pageController;
  final int currentTab = 0;

  @override
  void initState() {
    // TODO: implement initState
    _pageController = PageController(initialPage: currentTab);
    super.initState();
  }

  final List<Tab> myTabs = <Tab>[
    Tab(text: 'One'),
    Tab(
      text: 'Two',
    ),
  ];

  var tabs = [
    TabOne(),
    TabTwo(),
  ];

  @override
  Widget build(BuildContext context) {
    var pageView = PageView(
      controller: _pageController,
      physics: NeverScrollableScrollPhysics(),
      children: tabs,
    );

    return DefaultTabController(
      length: myTabs.length,
      child: Scaffold(
          extendBodyBehindAppBar: true,
          appBar: AppBar(
            backgroundColor: Colors.transparent,
            elevation: 0.0,
            automaticallyImplyLeading: false,
            title: Center(
              child: Container(
                decoration: BoxDecoration(
                  borderRadius: BorderRadius.circular(30),
                  color: Colors.grey.shade800,
                ),
                width: 200,
                height: 50,
                child: TabBar(
                  onTap: (index) {
                    _pageController.jumpToPage(index);
                  },
                  unselectedLabelColor: Colors.white,
                  indicator: BoxDecoration(
                      borderRadius: BorderRadius.circular(30),
                      color: Colors.black),
                  tabs: myTabs,
                ),
              ),
            ),
          ),
          body: pageView),
    );
  }
}

class TabOne extends StatelessWidget {
  const TabOne({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(child: Text('Tab one')),
    );
  }
}

class TabTwo extends StatelessWidget {
  const TabTwo({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Center(child: Text('Tab two')),
    );
  }
}

这样做,您将获得与 TabBarView 相同但没有动画的内容。

答案 2 :(得分:-3)

您可以通过转到MaterialApp并输入

进行修复

theme:new ThemeData( splashColor:Colors.blue, highlightColor: Colors.blue )

这是什么意思,如果您的标签背景颜色为蓝色,您将把splashColor和highlightColor更改为蓝色,这表示该动画没有被禁用,但它不会出现,因为动画的飞溅颜色和突出显示为蓝色,例如Tab Background,我希望我帮你