进度指示器的状态没有变化[重复]
Posted
技术标签:
【中文标题】进度指示器的状态没有变化[重复]【英文标题】:State not changing in flutter for progress indicator [duplicate] 【发布时间】:2021-01-20 23:35:19 【问题描述】:我正在尝试解析一个颤振的 api。异步请求延迟了进度指示器显示的响应。但是在获取响应后进度指示器不会消失。它仍然在屏幕上。
获取响应时如何将进度加载器的状态更改为listview.builder?
这是我的代码。
import 'dart:convert';
import 'package:flutter/material.dart';
import 'users.dart';
import 'package:http/http.dart' as http;
class HomePage extends StatefulWidget
@override
_HomePageState createState() => _HomePageState();
class _HomePageState extends State<HomePage>
bool isLoading = false;
List<Users> _users;
Future<List<Users>> getUsers() async
var response = await http.get(Uri.encodeFull('http://jsonplaceholder.typicode.com/users'));
_users = usersFromJson(response.body);
isLoading = true;
@override
void initState()
setState(()
getUsers();
);
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(
title: Text(isLoading ? "Parsed Json" : "Loading..."),
backgroundColor: Colors.deepPurple,
),
body: isLoading ? ListView.builder(
itemCount: _users.length,
itemBuilder: (BuildContext context,int index)
return ListTile(
leading: Image.network('https://images.unsplash.com/photo-1488426862026-3ee34a7d66df?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=334&q=80'),
title: Text(_users[index].name),
);
) : Center(child: CircularProgressIndicator()),
);
【问题讨论】:
你的布尔值总是假的,你把它设置为假 alwaysisLoading = false;
@Reign 现在给我错误:在 null 上调用了 getter 'length'。
将其设置为空 [] List<Users> _users = []
,如果长度 == 0 则创建另一个条件,如果不显示列表小部件
【参考方案1】:
工作代码,试试这个
class HomePage extends StatefulWidget
@override
_HomePageState createState() => _HomePageState();
class _HomePageState extends State<HomePage>
bool isLoading = false;
List<Users> _userList = [];
Future<void> getUsers() async
isLoading = true;
var response = await http
.get(Uri.encodeFull('http://jsonplaceholder.typicode.com/users'));
var jsonResponse = jsonDecode(response.body);
// print(jsonResponse);
jsonResponse.forEach((data)
Users user = Users.fromMap(data);
print(user);
_userList.add(user);
);
isLoading = false;
@override
void initState()
getUsers().then((value) => setState(() ));
super.initState();
@override
Widget build(BuildContext context)
return Scaffold(
appBar: AppBar(
title: Text(isLoading ? "Loading..." : "Parsed Json"),
backgroundColor: Colors.deepPurple,
),
body: isLoading
? Center(child: CircularProgressIndicator())
: ListView.builder(
itemCount: _userList.length,
itemBuilder: (BuildContext context, int index)
return ListTile(
title: Text(_userList[index].name),
);
));
class Users
int id;
String name;
String username;
Users(
this.id,
this.name,
this.username,
);
Map<String, dynamic> toMap()
return
'id': id,
'name': name,
'username': username,
;
factory Users.fromMap(Map<String, dynamic> map)
if (map == null) return null;
return Users(
id: map['id'],
name: map['name'],
username: map['username'],
);
String toJson() => json.encode(toMap());
factory Users.fromJson(String source) => Users.fromMap(json.decode(source));
@override
String toString() => 'Users(id: $id, name: $name, username: $username)';
【讨论】:
【参考方案2】:检查您的 _user != null 而不是 bool,然后显示列表,否则指示符
【讨论】:
【参考方案3】:void initState () 方法 当此对象插入树时调用。框架将为它创建的每个 State 对象仅调用一次此方法。所以 initState() 方法中不需要 setState。
在响应后尝试设置 setState,所以
@override
void initState()
super.initState();
getUsers();
Future<List<Users>> getUsers() async
isLoading = false;
var response = await http.get(Uri.encodeFull('http://jsonplaceholder.typicode.com/users'));
_users = usersFromJson(response.body);
print(_users);
setState(()
isLoading = true;
);
return _users;
【讨论】:
这个确实有效。谢谢以上是关于进度指示器的状态没有变化[重复]的主要内容,如果未能解决你的问题,请参考以下文章
Javafx - 从 java 类更新 UI 中的进度指示器