setState 不更新 ListView 数据

setState doesn't update the ListView data

我只想从 API 加载 ListView 上的数据,而不是 initState() 中的按钮单击事件。我从服务器获取数据但未在 ListView 上更新。

我搜索了这个但没有得到任何合适的解决方案,我是 flutter 的新手。

这是我的代码:

@override
  Widget build(BuildContext context) {

    List<dynamic> ListData = [];

Future _getData() async {

      String apiUrl = "http://myURL";
      final params = {"id": "1", "keyword": "xyz"};

      var response = await http.post(
        Uri.parse(apiUrl),
        body: params,
      );

      var jsonData = jsonDecode(response.body);

      List<dynamic> DATA = [];
      DATA = jsonData['data'];

      setState(() {
        ListData = DATA;
      });

      print('DATA COUNT: ${ListData.length}');

      return ListData;
    }
}

我正在正确地到达这里“数据计数”,请查看下面的 button & ListView 代码。

    SizedBox(
     height: 45,
     width: 60,
     child: ElevatedButton(
            style: ElevatedButton.styleFrom(
            primary: Colors.orangeAccent,
            ),
     onPressed: () async {
     await _getData();
     print('button pressed ${ListData.length}');
     },
     child: Text(
     '${ListData.length}',
     style: TextStyle(
     fontSize: 18.0,
     fontWeight: FontWeight.bold,
     ),
    ),
   ),
  ),
Expanded(
  child: ListView.builder(
    itemCount: ListData.length,
    itemBuilder: (context, index) {
      return ListTile(
        title: Text('${ListData[index]}'),
      );
    },
  ),
),

我在这里“按下按钮”也正确地获取数据,但没有在 button textListView builder 上更新,我的代码有什么问题在此先感谢。

您在构建 Methode 时分配了 ListData = []。当您的构建方法被 setState() 调用时,ListData 再次分配给 []。

尝试使用您的构建方法分配 ListData = []

从构建方法中删除您的 ListData。原因是每次重建方法时都会调用 setState,因此每次都会使您的 ListData 为空。

List<dynamic> ListData = [];

`@override

Widget build(BuildContext context) {



Future _getData() async {

  String apiUrl = "http://myURL";
  final params = {"id": "1", "keyword": "xyz"};

  var response = await http.post(
    Uri.parse(apiUrl),
    body: params,
  );

  var jsonData = jsonDecode(response.body);

  List<dynamic> DATA = [];
  DATA = jsonData['data'];

  setState(() {
    ListData = DATA;
  });

  print('DATA COUNT: ${ListData.length}');

  return ListData;
}

}`