user11065582
user11065582

Reputation:

Failed Assertion: Boolean expression must not be null

I stored isQuick value from the backend. I used sqflite to cache. Always result is false

In my dashboard page,

 bool isQuick;
 @override
  void initState() {
 isQuick = false;

 timer1 = Timer.periodic(Duration(seconds: 5), (Timer t) {
  checkQuick(_url, tokens, isQuick);
});

timer = Timer.periodic(Duration(seconds: 10), (Timer t) {
      Future datas = HelperDatabase1().displayGetUserPreference();
      datas.then((v) => {
        data = v,
        print('new data ${data[0].data}'),
        data[0].data == 0 ? this.isQuick == false : this.isQuick == true,
        print(this.isQuick)
      });
      submitRequestSave(_url, tokens);
    });
    }

in my build method,

 @override
  Widget build(BuildContext context) {
  return WillPopScope(
        onWillPop: () async => false,
        child: Scaffold(
          backgroundColor: Colors.white,
          appBar: AssetRegisterAppBar(context),
          body: makeBody(litems, litems_icon, _url, this.isQuick, isOffline,
              statusbarHeight, context),
        ));
}

checkQuick method,

  Future checkQuick(String url, String token, bool isQuick) async {
    print('quick $isQuick');
    bool newQuick;
    final response = await http.get(
      '$url/nativeapi/v1.0/User/GetUserPreference',
      headers: {'Authorization': 'Bearer $token'},
    );
    final jsonResponse = json.decode(response.body);
    GetUserPreference model = GetUserPreference.fromJson(jsonResponse);
    var data = GetUserPreference(data: model.data);
    print(data.data);
    if (data.data == 0) {
      newQuick = false;
    } else {
      newQuick = true;
    }
    print('new quick $newQuick');
    if (isQuick != newQuick) {
      int newData;
      if (newQuick) {
        newData = 1;
      } else {
        newData = 0;
      }
      await HelperDatabase1().updateGetUserPreference(1, newData);
    }
  }

Upvotes: 0

Views: 8681

Answers (1)

Michael Yuwono
Michael Yuwono

Reputation: 2617

Your isQuick was null at the time it was called to build your page. Assign a default value to it:

@override
void initState() {
  isQuick = false; // or true

  Future datas = HelperDatabase1().displayGetUserPreference();
  datas.then((v) =>
    {data = v, data[0].data == 0 ? this.isQuick == false : this.isQuick == true});
}

UPDATE

To address the main issue, you need to display the alternative widgets (such as CircularProgressIndicator) when the value of isQuick is still loading (or is still null).

return WillPopScope(
  onWillPop: () async => false,
  child: Scaffold(
    backgroundColor: Colors.white,
    appBar: AssetRegisterAppBar(context),
    body: isQuick == null
      ? CircularProgressIndicator()
      : makeBody(litems, litems_icon, _url, this.isQuick, isOffline, statusbarHeight, context),
  ),
);

Upvotes: 3

Related Questions