【问题标题】: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 则创建另一个条件,如果不显示列表小部件

标签: api flutter


【解决方案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;
        }
      

      【讨论】:

      • 这个确实有效。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2012-09-11
      • 1970-01-01
      • 2019-03-01
      相关资源
      最近更新 更多