Android 如果列表为空,如何显示图像?

Android 如果列表为空,如何显示图像?,android,ios,json,flutter,dart,Android,Ios,Json,Flutter,Dart,我想在中间显示一个图像或文本,比如找不到记录所有细节都是从API获取的。在本机Android中setEmptyView()用于此条件,但不知道如何在Flatter中执行此操作。“不停止进度”对话框正在运行,但未显示文本。我用JSON响应添加了代码 List<NewAddressModel> newAddress = List(); bool isLoading = false; Scaffold( body :isLoading ? Center(

我想在中间显示一个图像或文本,比如
找不到记录
所有细节都是从API获取的。在本机Android中
setEmptyView()
用于此条件,但不知道如何在Flatter中执行此操作。“不停止进度”对话框正在运行,但未显示文本。我用JSON响应添加了代码

List<NewAddressModel> newAddress = List();
bool isLoading = false;

Scaffold(
body :isLoading
          ? Center(
        child: CircularProgressIndicator(),
      )
          : Container(
          color: Color.fromRGBO(234, 236, 238, 1),
          child: getListView()
      ),
)

我想告诉您,对于这种用法,请使用
FutureBuilder
。 在您的代码中,我不确定您在哪里更改
isLoading
标志的状态

因此,请更新您的问题,并确保您正在适当的范围内更改
isLoading
标志


请参考
FutureBuilder

的实现。为此,您必须使用不同的
小部件。当没有数据时,您可以使用类似的方法来显示空图像

@override
    Widget build(BuildContext context) {
        if (array.isEmpty()) {
            return Widget(child: Thing(this.name));
        } else {
            return Widget(child: WithoutThing(this.name));
        }
    }

希望这会有所帮助。

更好的方法是使用
FutureBuilder
这里有各种检查
FutureBuilder(
FutureBuilder<AsyncSnapshot<AsyncSnapshot>>(
        builder: (context, snap) {
          if (snap.connectionState != ConnectionState.done) {
            return Text("loading");
          } else {
            if (snap.hasError) {
              return Text([snap.error.toString()]); 
            }
            else {
              if (snap.hasData) {


                return getListView("${snap.data}");
              } else {
                return Text("No DAta");
              }
            }
          }
        },
        future:
        methodToGetAPIResult(),
    );
生成器:(上下文,捕捉){ if(snap.connectionState!=connectionState.done){ 返回文本(“加载”); }否则{ if(snap.hasError){ 返回文本([snap.error.toString()]); } 否则{ if(snap.hasData){ 返回getListView(“${snap.data}”); }否则{ 返回文本(“无数据”); } } } }, 未来: MethodToGetApireResult(), );
试试这个

import 'dart:convert';

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

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() => runApp(MaterialApp(home: MyWidget()));

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  Future<List<NewAddressModel>> newAddress;

  @override
  void initState() {
    newAddress = hitGetAddressApi();
    super.initState();
  }

  Future<List<NewAddressModel>> hitGetAddressApi() async {
    final response = await http.post("api");
    if (response.statusCode == 200) {
      final responseBody = json.decode(response.body);
      if (responseBody is List)
        return responseBody
            .map((data) => new NewAddressModel.fromJson(data))
            .toList();
      else {
        print(responseBody);
        return null;
      }
    } else {
      print(response.statusCode);
      throw Exception("Problem in fetching address List");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<NewAddressModel>>(
        future: newAddress,
        builder: (context, snapShot) {
          if (snapShot.connectionState == ConnectionState.waiting)
            return Center(
              child: CircularProgressIndicator(),
            );
          else if (snapShot.hasError) {
            return Center(
              child: Text("ERROR: ${snapShot.error}"),
            );
          } else {
            if (snapShot.hasData && snapShot.data.isNotEmpty)
              return getListView(snapShot.data);
            else //`snapShot.hasData` can be false if the `snapshot.data` is null
              return Center(
                child: Text("No Data Found"),
              );
          }
        },
      ),
    );
  }

  Widget getListView(List<NewAddressModel> addressList) {
    return ListView.builder(
      itemCount: addressList.length,
      itemBuilder: (BuildContext context, int index) {
        final address = addressList[index];
        //Change `addressViewCard` to accept an `NewAddressModel` object
        return addressViewCard(address);
      },
    );
  }

  Widget addressViewCard(NewAddressModel address) {
    //implement based on address instead of index
    return ListTile(title: Text("${address.address}"));
  }
}

class NewAddressModel {
  String id;
  String name;
  String mobile;
  String address;
  String state;
  String city;
  String pin;
  String userid;

  NewAddressModel({
    this.id,
    this.name,
    this.mobile,
    this.address,
    this.state,
    this.city,
    this.pin,
    this.userid,
  });

  factory NewAddressModel.fromJson(Map<String, dynamic> json) =>
      NewAddressModel(
        id: json["id"],
        name: json["name"],
        mobile: json["mobile"],
        address: json["address"],
        state: json["state"],
        city: json["city"],
        pin: json["pin"],
        userid: json["userid"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "mobile": mobile,
        "address": address,
        "state": state,
        "city": city,
        "pin": pin,
        "userid": userid,
      };
}
导入'dart:convert';
进口“包装:颤振/材料.省道”;
将“package:http/http.dart”导入为http;
最终颜色深蓝色=颜色。来自argb(255,18,32,47);
void main()=>runApp(MaterialApp(home:MyWidget());
类MyWidget扩展了StatefulWidget{
@凌驾
_MyWidgetState createState()=>\u MyWidgetState();
}
类_MyWidgetState扩展状态{
未来新地址;
@凌驾
void initState(){
newAddress=hitGetAddressApi();
super.initState();
}
未来hitGetAddressApi()异步{
最终响应=等待http.post(“api”);
如果(response.statusCode==200){
final responseBody=json.decode(response.body);
如果(响应主体为列表)
返回响应体
.map((数据)=>新的NewAddressModel.fromJson(数据))
.toList();
否则{
打印(应答本);
返回null;
}
}否则{
打印(响应状态码);
抛出异常(“获取地址列表时出现问题”);
}
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:未来建设者(
未来:新地址,
生成器:(上下文,快照){
if(snapShot.connectionState==connectionState.waiting)
返回中心(
子对象:CircularProgressIndicator(),
);
else if(snapShot.hasrerror){
返回中心(
子项:文本(“错误:${snapShot.ERROR}”),
);
}否则{
if(snapShot.hasData&&snapShot.data.isNotEmpty)
返回getListView(snapShot.data);
else/`snapShot.hasData`如果`snapShot.data`为空,则可以为false
返回中心(
子项:文本(“未找到数据”),
);
}
},
),
);
}
小部件getListView(列表地址列表){
返回ListView.builder(
itemCount:addressList.length,
itemBuilder:(构建上下文,int索引){
最终地址=地址列表[索引];
//更改“addressViewCard”以接受“NewAddressModel”对象
返回地址查看卡(地址);
},
);
}
小部件地址查看卡(NewAddressModel地址){
//基于地址而不是索引的实现
返回ListTile(标题:Text(“${address.address}”);
}
}
类NewAddressModel{
字符串id;
字符串名;
字符串移动;
字符串地址;
字符串状态;
字符串城市;
弦销;
字符串用户标识;
新地址模型({
这个身份证,
这个名字,
这个.手机,,
这个地址,
这个州,
这个城市,
这个.pin,,
这个.userid,
});
工厂NewAddressModel.fromJson(映射json)=>
新地址模型(
id:json[“id”],
名称:json[“名称”],
mobile:json[“mobile”],
地址:json[“地址”],
状态:json[“状态”],
城市:json[“城市”],
pin:json[“pin”],
userid:json[“userid”],
);
映射到JSON()=>{
“id”:id,
“姓名”:姓名,
“移动”:移动,
“地址”:地址,
“国家”:国家,
“城市”:城市,
“别针”:别针,
“userid”:userid,
};
}

在您的情况下,最好的解决方案是使用


您是否检查是否得到正确的响应。我的意思是状态代码200?如果你的api正在加载,你可以有一个布尔变量来保存状态,当你从api得到响应时,将其转换为false并显示其他视图,因此,在您的scaffold中,您可以检查该变量并相应地显示视图是的,如果我添加了一个项目,我会得到一个响应,但当我删除所有详细信息时,此过程对话框正在运行不停止。如果您不理解,请告诉我,如果我的JSON响应为null或列表为空,则它在中心显示未找到任何记录。@Dev check现在。如果列表中没有数据,则每次执行错误块。请解释每次发生的情况
if(snap.hasError){返回文本([snap.error.toString());}
block已执行。如果我的列表为空,[snap.error.toString()]的输出是什么在这种情况下,获取snapUnhandled异常时似乎出现错误:类型“\u InternalLinkedHashMap”不是CastType中“List”类型的子类型。此异常是occurs@Toyed回复主体是一个列表吗?你能在你的问题中添加json响应的例子吗?是的,我是adding@Toyed我更新了代码。了解如何处理响应主体d
@override
    Widget build(BuildContext context) {
        if (array.isEmpty()) {
            return Widget(child: Thing(this.name));
        } else {
            return Widget(child: WithoutThing(this.name));
        }
    }
FutureBuilder<AsyncSnapshot<AsyncSnapshot>>(
        builder: (context, snap) {
          if (snap.connectionState != ConnectionState.done) {
            return Text("loading");
          } else {
            if (snap.hasError) {
              return Text([snap.error.toString()]); 
            }
            else {
              if (snap.hasData) {


                return getListView("${snap.data}");
              } else {
                return Text("No DAta");
              }
            }
          }
        },
        future:
        methodToGetAPIResult(),
    );
import 'dart:convert';

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

final Color darkBlue = Color.fromARGB(255, 18, 32, 47);

void main() => runApp(MaterialApp(home: MyWidget()));

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  Future<List<NewAddressModel>> newAddress;

  @override
  void initState() {
    newAddress = hitGetAddressApi();
    super.initState();
  }

  Future<List<NewAddressModel>> hitGetAddressApi() async {
    final response = await http.post("api");
    if (response.statusCode == 200) {
      final responseBody = json.decode(response.body);
      if (responseBody is List)
        return responseBody
            .map((data) => new NewAddressModel.fromJson(data))
            .toList();
      else {
        print(responseBody);
        return null;
      }
    } else {
      print(response.statusCode);
      throw Exception("Problem in fetching address List");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<NewAddressModel>>(
        future: newAddress,
        builder: (context, snapShot) {
          if (snapShot.connectionState == ConnectionState.waiting)
            return Center(
              child: CircularProgressIndicator(),
            );
          else if (snapShot.hasError) {
            return Center(
              child: Text("ERROR: ${snapShot.error}"),
            );
          } else {
            if (snapShot.hasData && snapShot.data.isNotEmpty)
              return getListView(snapShot.data);
            else //`snapShot.hasData` can be false if the `snapshot.data` is null
              return Center(
                child: Text("No Data Found"),
              );
          }
        },
      ),
    );
  }

  Widget getListView(List<NewAddressModel> addressList) {
    return ListView.builder(
      itemCount: addressList.length,
      itemBuilder: (BuildContext context, int index) {
        final address = addressList[index];
        //Change `addressViewCard` to accept an `NewAddressModel` object
        return addressViewCard(address);
      },
    );
  }

  Widget addressViewCard(NewAddressModel address) {
    //implement based on address instead of index
    return ListTile(title: Text("${address.address}"));
  }
}

class NewAddressModel {
  String id;
  String name;
  String mobile;
  String address;
  String state;
  String city;
  String pin;
  String userid;

  NewAddressModel({
    this.id,
    this.name,
    this.mobile,
    this.address,
    this.state,
    this.city,
    this.pin,
    this.userid,
  });

  factory NewAddressModel.fromJson(Map<String, dynamic> json) =>
      NewAddressModel(
        id: json["id"],
        name: json["name"],
        mobile: json["mobile"],
        address: json["address"],
        state: json["state"],
        city: json["city"],
        pin: json["pin"],
        userid: json["userid"],
      );

  Map<String, dynamic> toJson() => {
        "id": id,
        "name": name,
        "mobile": mobile,
        "address": address,
        "state": state,
        "city": city,
        "pin": pin,
        "userid": userid,
      };
}