【问题标题】:setState doesn't update the ListView datasetState 不更新 ListView 数据
【发布时间】:2021-06-22 10:43:43
【问题描述】:

我想从 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;
    }
}

我正确地到达这里“数据计数”,检查下面的buttonListView 代码。

    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 上没有更新,我的代码有什么问题提前谢谢。

【问题讨论】:

  • 你的数据在服务器上是不是地图列表?
  • 你可以看到这个答案它会帮助你stackoverflow.com/questions/67844897/…
  • 另外一件事是,在从服务器获取数据时不要使用 POST 方法

标签: flutter dart listview dart-async


【解决方案1】:

从 build 方法中删除您的 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;
}

}`

【讨论】:

    【解决方案2】:

    您正在构建 Methode 中分配 ListData = []。当你的 build Methode 被 setState() 调用时,ListData 被再次赋值给 []。

    尝试通过您的构建方法分配 ListData = []

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2020-11-16
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      相关资源
      最近更新 更多