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);
    }
  }

1 answer

  • answered 2019-05-21 11:30 Michael Yuwono

    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),
      ),
    );