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,
};
}