Jack Siro
Jack Siro

Reputation: 797

Calling a function after Widget build(BuildContext context)

I am into flutter to port my android app from java. One thing that is evident in flutter is widgets. Now my biggest obstacle to make my app work as it was on android is starting an async task to request data from the server. I have a custom progress dialog that can be shown or hidden.

class MySelection extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return MySelectionState();
  }
}

class MySelectionState extends State<MySelection> {
  final globalKey = new GlobalKey<ScaffoldState>();
  ProgressDialog progressDialog = ProgressDialog.getProgressDialog("Loading books ...");
  List<Book> books;

  void requestData() async {
    EventObject eventObject = await getBooks();
    books = eventObject.object;
    populateData();
  }

  @override
  Widget build(BuildContext context) {
    if (books == null) {
      books = List<Book>();
      requestData();
    }

    var appBar = AppBar();
    return Scaffold(
      appBar: AppBar(
        title: Text('Set up your Collection'),
        actions: <Widget>[
          IconButton(
            icon: Icon(Icons.refresh),
            onPressed: () {
              books = List<Book>();
              requestData();
            },
          ),
        ],
      ),

      body: SingleChildScrollView(
        child: Stack(
            Container(
              height: (MediaQuery.of(context).size.height - (appBar.preferredSize.height * 2)),
              padding: const EdgeInsets.symmetric(horizontal: 10),
              margin: EdgeInsets.only(top: 50.0),
              child: ListView.builder(
                physics: BouncingScrollPhysics(),
                itemCount: books.length,
                itemBuilder: bookListView,
              ),
            ),
            Container(
              height: (MediaQuery.of(context).size.height),
              padding: const EdgeInsets.symmetric(horizontal: 10),
              child: progressDialog,
            ),
          ],
        ),
      ),
  }
}

Now, this code works well when I don't call the progress dialog unlike when I try to do that by calling my progressdialog widget.

if (books == null) {
   progressDialog.showProgress();
   books = List<Book>();
   requestData();

}

It throws the error that

The method 'showProgress' was called on null. Receiver: null Tried calling: showProgress()

Of course, the reason is that I am calling this before its widget is even created. Now my question is how can I do this because I can't afford to put a button for the user to click. I just want this to work on its own once the user is on this particular screen.

Upvotes: 1

Views: 1430

Answers (1)

KumarSunil17
KumarSunil17

Reputation: 223

import 'package:flutter/scheduler.dart';


@override
void initState() {
    super.initState();
    SchedulerBinding.instance.addPostFrameCallback((timeStamp) {
        //  add your code which you want to execute after your build is complete
    });
}

Thanks.

Upvotes: 2

Related Questions