Drawer is taking time when first time opening

Widget drawerBody() {
    final menuItems = Places().getStatesOfSouthIndia();
    return ListView.builder(
      itemCount: menuItems.length,
        itemBuilder: (context, index) {
      if (index == 0) {
        return DrawerHeader(
          child: Stack(
            children: [
              Container(
                width: MediaQuery.of(context).size.width,
                  child: Image.asset('assets/images/pic5.jpg', fit: BoxFit.fill,)),
              Align(
                alignment: Alignment.bottomLeft,
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: Text(
                    'South India',
                    style: TextStyle(
                      color: Colors.white
                    ),
                  ),
                ),
              )
            ],
          ),
        );
      } else
        return ListTile(
          title: Text(menuItems[index]),
          leading: Icon(Icons.thumb_up),
      );
    });
  }

This is an API call?

final menuItems = Places().getStatesOfSouthIndia();

You shouldn’t fetch this everytime the drawer is opened, I would suggest you to add state management to your app using Provider, Getx or Bloc and fetch this, perhaps once per session and store it in a variable and wrap your drawer with a listener/consumer so that the experience is smooth. You can also show a loader while the fetch is in progress.

This is not an API Call.