【问题标题】:Flutter, problem using InitState method and problem using setStateFlutter,使用 InitState 方法的问题和使用 setState 的问题
【发布时间】:2019-12-08 17:21:04
【问题描述】:

我尝试了很多方法来调用 API 并获取数据,这很令人满意,但我无法通过正确的方法做到这一点,当我从构建中做到这一点时,它工作得很好,但它不是正确的地方,当我尝试在 initState 中执行它时它根本不起作用,它甚至不执行 print();

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

class Post {
  final List<dynamic> data;

  Post({this.data});

  factory Post.fromJson(Map<String, dynamic> json) {
    return Post(
      data: json['response'],
    );
  }
}

class LoaderPublicity extends StatefulWidget {


  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _LoaderPublicity();
  }
}

class _LoaderPublicity extends State<LoaderPublicity> {
  List allPublicity;

  @override
  void initState() {
    super.initState();
    getPublicity().then((value) {
      print(allPublicity);
    });
    print(allPublicity);
  }

  //Obtener todas las publicidades desde el api
  Future<void> getPublicity() async {
    var response = await http.post(
        'http://contablenift.co:3008/consult/getGeneralPublicity',
        body: {'actividad': "Turistico", 'location': "No"});
    print('????????2');
    if (response.statusCode == 200) {
      setState(() {
        allPublicity = Post.fromJson(json.decode(response.body)).data;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    getPublicity();
    // TODO: implement build
    return Container(
      child: Column(
        children: <Widget>[Text('Aqui va la publicidad')],
      ),
    );
  }
}

** 解决了问题,去了整个开发组后发现我的手机没有网络,开心一天**

【问题讨论】:

  • 你想在哪里打电话给getPublicity()?在initState?
  • 是的,在 initState 中。此函数调用 API 并更新 allPublicity
  • 为什么要返回getPublicity() 中的数据?我会把它留在setState(),然后使用类中的变量。将 getPublicity() 的返回类型设置为 void 并保留它。
  • 另外,请勿使用this 拨打setState()。删除this,因为你不需要它。
  • ingles:已经修改为返回数据给变量,绘制修改,函数的当前状态是让它运行的尝试的总和,它真正尝试的是让它运行在 initState 中能够使用 setState

标签: flutter


【解决方案1】:

下面的代码应该可以工作,我在 initState 方法中添加了一个回调。

class LoaderPublicity extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _LoaderPublicity();
  }
}

class _LoaderPublicity extends State<LoaderPublicity> {
  List allPublicity;

  @override
  void initState() {
    super.initState();
    getPublicity().then((value) {
      print(allPublicity);
      print(value);
    });
  }

  //Obtener todas las publicidades desde el api
  Future<void> getPublicity() async {
    var response = await http.post(
        'http://contablenift.co:3008/consult/getGeneralPublicity',
        body: {'actividad': "Turistico", 'location': "No"})
    print('????????2');
    if (response.statusCode == 200) {
      setState(() {
        allPublicity = Post.fromJson(json.decode(response.body)).data;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: <Widget>[Text('Aqui va la publicidad')],
      ),
    );
  }
}

【讨论】:

  • @override void initState() { super.initState(); // 给这个类添加监听 getPublicity().then((response){ print(allPublicity); print(response); if (response.statusCode == 200) { setState(() { allPublicity = Post.fromJson(json.解码(response.body)).data; }); 打印(allPublicity); } }); }
  • 我忘了 Future 的返回类型,我的错
  • 另外,每次编辑initState方法时,都需要热重启app。
  • 是的,我将 Future 类型放入 getPublicity()
  • 未来的 getPublicity() 异步
猜你喜欢
  • 1970-01-01
  • 2020-12-02
  • 2020-05-26
  • 2021-10-10
  • 2021-08-22
  • 1970-01-01
  • 2014-01-16
  • 2011-10-03
  • 2012-05-02
相关资源
最近更新 更多