Search code examples
flutterswipetabbar

flutter tabbar swippable issue


i am newbie to flutter and i created a tab bar and tab bar view by adding dynamic content as following code. when click on tab in tab bar it works fine. but swiping tab bar view new value always detect on another swipe for example move to tab one tab bar view says 0. move to tab 2 tab bar view says 1.

please help me friends.

  @override
  void initState() {
    super.initState();
    setState(() {
      _isLoading = true;
       num = 0;
   for(int i=0;i<3;i++){
      _tabs.add(Tab(text: '${i + 1}'));
      tabView.add(getWidget());
    }
     _tabController = TabController(vsync: this, length: _tabs.length, initialIndex: 0);   

     _tabController.addListener((){
       print('index${_tabController.index}');
       setState(() {
       num = _tabController.index ;  
       });
 });

           
  Widget getWidget(){
    return Builder(builder: (BuildContext context) {
    return Text('${num}');
      });
 }

  @override
  Widget build(BuildContext context) {
   return 
    DefaultTabController(
  length: _tabs.length,
  child:Scaffold(
     appBar: AppBar(
        title: Text("cart"),
        bottom: TabBar(
          controller: _tabController,
        tabs: _tabs,
      ),
      ),   
   body: TabBarView(
       controller: _tabController,
  children:tabView,
  ),
 });

Solution

    1. Use AutomaticKeepAliveClientMixin
    2. override wantKeepAlive property and return true

    Instead of this:

     tabView.add(getWidget());
    

    use:

     tabView.add(Tabpageview(TabData(i)));
    
    class Tabpageview extends StatefulWidget {
      final tabData;
    
      Tabpageview(this.tabData);
    
      @override
      _TabpageviewState createState() => _TabpageviewState();
    }
    
    class _TabpageviewState extends State<Tabpageview>
        with AutomaticKeepAliveClientMixin {
      @override
      bool get wantKeepAlive => true;
    
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return Tab(child: Center(child: Text('Tab : ${widget.tabData.data}')));
      }
    }
    
    class TabData {
      int data;
      TabData(this.data);
    }