进度指示器的状态没有变化[重复]

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&lt;Users&gt; _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 中的进度指示器

UIRefreshControl 没有进度活动指示器-> 立即开始?

在状态栏中隐藏活动指示器[重复]

进度指示器——是菊花还是进度条?

纱线进度指示器代表啥?

根据指示状态变化的事件绘制状态图