首页 > 解决方案 > 没有从 ListView.Builder 打印到模拟器中,而 initState 显示我的列表有 2 个元素

问题描述

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';

void main() {
  runApp(MyHomePage());
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> ListSearch = [];
  Future getData() async {
    var data = await http.get('http://10.0.2.2/DBCON/search.php');
    var databody = jsonDecode(data.body);
    for (int i = 0; i < databody.length; i++) {
      ListSearch.add(databody[i]['NAME']);
    }
    print(ListSearch);
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text('ss'),
        ),
        body: ListView.builder(
          itemCount: ListSearch.length,
          itemBuilder: (context, index) {
            return Column(
              children: [
                Text(ListSearch[index]),
                Text(ListSearch.length.toString()),
              ],
            );
          },
        ),
      ),
    );
  }
}

我正在尝试从本地主机中获取一些数据并在模拟器中的应用程序中显示它们,但是模拟器什么也没显示,并且 initState 在 ListSearch 列表中给出了 2 个元素的输出,有人能告诉我为什么什么都没有打印以及如何解决吗?

这是模拟器中的输出

这是调试控制台中 initState 的输出

标签: visual-studioflutterlistviewflutter-testflutter-listview

解决方案


您可以在下面复制粘贴运行完整代码
演示代码有3秒延迟来模拟网络延迟
您可以bool isLoading用来控制何时isLoading显示CircularProgressIndicator(),何时加载完成显示ListView
代码片段

bool isLoading = true;
Future getData() async {
    ...
    print(ListSearch);

    setState(() {
      isLoading = false;
    });
...
body: isLoading
            ? Center(child: CircularProgressIndicator())
            : ListView.builder(

工作演示

在此处输入图像描述

完整代码

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';

void main() {
  runApp(MyHomePage());
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> ListSearch = [];
  bool isLoading = true;
  Future getData() async {
    //var data = await http.get('http://10.0.2.2/DBCON/search.php');
    await Future.delayed(Duration(seconds: 3), () {});
    String jsonString = '''
    [
      {"NAME": "Samsung A30"},
      {"NAME": "Samsung Note20"}
    ]
    ''';

    http.Response data = http.Response(jsonString, 200);
    var databody = jsonDecode(data.body);
    for (int i = 0; i < databody.length; i++) {
      ListSearch.add(databody[i]['NAME']);
    }
    print(ListSearch);

    setState(() {
      isLoading = false;
    });
  }

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text('ss'),
        ),
        body: isLoading
            ? Center(child: CircularProgressIndicator())
            : ListView.builder(
                itemCount: ListSearch.length,
                itemBuilder: (context, index) {
                  return Column(
                    children: [
                      Text(ListSearch[index]),
                      Text(ListSearch.length.toString()),
                    ],
                  );
                },
              ),
      ),
    );
  }
}

推荐阅读