Home > OS >  Write to/read from file and setState - flutter
Write to/read from file and setState - flutter

Time:03-27

Question for more experienced colleagues. In my application I have a listview of items loaded from a json file.

itemBuilder: (context, index) => allRadioList(articles[index], context, _content, onPressing: () {
_writeDataFav(articles[index].id.toString(), _content);
_readData();
}),
          

The user can add an item to the favorites by clicking on the button via writing an array with ID numbers to a local file, then loading the contents of the file and saving it to setState.

IconButton(
icon: Icon(LineIcons.heartAlt, size: 20, color: Colors.yellow),
onPressed: onPressing,
),

When a user removes an item from favorites, I load the contents of the file, modify it and save it to the file, and then load it and save it to setState.

    Future<void> _readData() async {
    final dirPath = await _getDirPath();
    final myFile = await File('$dirPath/fav.txt');
    final data = await myFile.readAsString(encoding: utf8);
    setState(() {
      _content = data;
    });
  }
    Future<void> _writeDataFav(newString, _content) async {
    final _dirPath = await _getDirPath();
    final _myFile = File('$_dirPath/fav.txt');
      String res = '${_content}|${newString}|';
      await _myFile.writeAsString(res);
  }

This works almost perfectly, but occasionally the contents of the file don't load, after action click or an empty table is loaded. After refreshing everything is ok. It looks like the file could not be loaded before the next operations were performed.

Is it possible to execute the function only after verifying that the file has been saved? Only then set setState?

I considered using sharedPreferrences or a local database, but that's probably too much for such a small array of data.

CodePudding user response:

Change the onPressing to async function so _readData will only be executed after _writeDataFav is completed.

onPressing: () async {
  await _writeDataFav(articles[index].id.toString(), _content);
  await _readData();
}),
  • Related