setState()在flutter的异步调用中不起作用

jvlzgdj9  于 2023-02-20  发布在  Flutter
关注(0)|答案(4)|浏览(272)

我试图读取一个名为mood.json的json文件,并将其解析为一个名为“data”的列表,但当我运行setState()时,data没有改变,对此问题有帮助吗?代码如下所示:

class DisplayPage extends StatefulWidget {
    @override
  _DisplayPageState createState() => new _DisplayPageState();
}

class _DisplayPageState extends State<DisplayPage> {
  List _data = [];
  Directory dir;
  File jsonFile;
  String jsonPath;

    Future getData() async {
    dir = await getApplicationDocumentsDirectory();
    jsonPath = dir.path + "/" + "mood.json";
    jsonFile = new File(jsonPath);
    setState(() {
       _data = json.decode(jsonFile.readAsStringSync());
    });
  }

  @override
  void initState() {
    super.initState();
    getData();
    print(_data.length);
  }

@override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new  Text('Mood')
      ),
      body: new ListView.builder(
          itemCount: _data.length,
          itemBuilder: (BuildContext context, int index) {
          return new Card(
          child: new Text(_data[index]["title"]),
          );
          },),
    );
  }
}
dnph8jn4

dnph8jn41#

我想你的问题可能是别的我把你的代码和改变网络调用只需等待5秒钟,然后返回一些虚拟数据,它工作正常。

Future getData() async {
  await new Future.delayed(const Duration(seconds: 5));
  setState(() {
    _data = [
      {"title": "one"},
      {"title": "two"},
    ];
  });
}

您应该在setState调用中放置一个断点,以确保它确实被调用,并且分配给_data的数据是您所期望的。

pwuypxnk

pwuypxnk2#

您应该在“setState”方法之外使用“async”。

**注:**使用“await”表示等待响应。

Future getData() async {        
        dir = await getApplicationDocumentsDirectory();
        jsonPath = dir.path + "/" + "mood.json";
        jsonFile = new File(jsonPath);
        
        //Use async outside
        var json = await json.decode(jsonFile.readAsStringSync());
        
        //Change values on setState
        setState(() {
           _data = json;
        });
     }
wyyhbhjk

wyyhbhjk3#

this post中所述,使用

WidgetsBinding.instance.addPostFrameCallback((_) => setState(...));

而不是仅仅

setState(...)
ubby3x7f

ubby3x7f4#

编辑 * 对不起我错了,你可以从initState()调用异步方法,只需调用它而无需等待

@override
void initState() {
    super.initState();
    /// getData(); /// this is an async method, and it's return a future. 
    /// you can use await instead so the code bellow getData() method execution 
    /// will be waiting for it to complete first.
    /// Here it is :
    getData(); 
    print(_data.length); /// This print now will waiting until the getData completed
}

以下是一些参考资料:https://dart.dev/codelabs/async-await#working-with-futures-async-and-await

相关问题