2

So basically I have a widget which I Navigate to:

Navigator.of(context).pushNamed(Purchases.route, arguments: {"index": index});

The Purchases widget is simply an empty Widget with nothing except two tabs using TabBar, TabBarView, and TabController. The tabs are for pending and delivered. The idea is, when I navigate to the widget, the correct tab is the initial tab that is open.

For example: When I click pending on the previous widget, the navigator navigates to the Purchases widget and the pending tab is the initial tab that is open. When I click delivered on the previous widget, the navigator navigates to the Purchases widget and the delivered tab is the initial tab that is open.

I pass the index of the tab that I want opened and use it in the initState method and it works, however only partially.

void initState() {
    super.initState();
    _controller = TabController(length: 2, vsync: this);
    Future.delayed(Duration.zero, () {
      final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>;
      int index = args["index"];
      _controller.animateTo(index);
    });
}

This implementation works, however the tab isn't really initially open, its only animated after the tab at index 0 is opened. This is bad performance since I plan on making API calls whenever the tabs open and if the user didn't open/care for the tab at index 0, then its a useless API call.

I have tried:

void initState() {
    super.initState();
    final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>;
    int index = args["index"];
    _controller = TabController(length: 2, vsync: this, initialIndex: index);
}

This doesn't work because context isn't available for use and results in an error.

How could I properly get this to work? Thank You!

2 Answers 2

2

So I did a little digging and found this to be the solution:

void didChangeDependencies() {
    super.didChangeDependencies();
    final args = ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>;
    int index = args["index"];
    _controller = TabController(length: 2, vsync: this, initialIndex: index);
}

I guess initState wasn't the correct approach. didChangeDependencies does get called after every build whereas initState doesn't. Something to consider.

Sign up to request clarification or add additional context in comments.

Comments

0

Setting an initialIndex to the TabController is the right approach.

In order to have access to the context, you need call your API inside a separate function and then call it inside initState.

void apiCall(){
  //Call here your API (context accessible).
}
@override
initState((){
  ...
  apiCall();
  ...
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.