发布http请求:在null flutter上调用getter“长度”

时间:2019-09-20 09:25:59

标签: android mobile flutter flutter-layout

我想在调用API时创建一个用户。 我用URL创建了Future,然后在屏幕页面中调用模型。 我以表格形式获取所有数据,但是当我调用API时,出现此错误:

getter'length'被调用为null ...

用户模型:

function filterfaq () {
  const search = this.searchValue.toLowerCase().trim();
  if (!search) return this.faq;
  return this.faq.map(item => {
    return {
      ...item,
      content: item.content.filter(question => {
        return question.qus.toLowerCase().includes(search);
      }),
    }
  });
}

编辑:

我在修改后添加了登录页面的所有代码。

在登录页面中:

class Candidate {
  int id;
  String firstname;
  String lastname;
  String email;

  Candidate({this.id, this.firstname, this.lastname, this.email});

  factory Candidate.fromJson(Map<String, dynamic> json) {
    return Candidate(
      id: json['id'],
      firstname: json['firstname'],
      lastname: json['lastname'],
      email: json['email'],
    );
  }

  Map toMap() {
    var map = new Map<String, dynamic>();
    map["id"] = id;
    map["firstname"] = firstname;
    map["lastname"] = lastname;
    map["email"] = email;
    return map;
  }

  Future<Candidate> candidateAuth({Map body}) async {
    String url = 'http://10.0.2.2:3000/v1/api/auth/candidate';
    final response = await http.post(url, body: body, headers: {"Accept": "application/json"});

    if (response.statusCode == 201) {
      return Candidate.fromJson(json.decode(response.body));
    } else {
      throw Exception('Failed auth');
    }
  }
}

错误消息:

  

发生异常。
  NoSuchMethodError(NoSuchMethodError:在null上调用了getter'length'。   接收方:null尝试调用:   长度)在处理手势时引发了以下断言:   setState()回调参数返回Future。 setState()方法   在_Login#e2125上使用返回了Future的闭包或方法进行了调用。   也许它被标记为“异步”。而不是执行   在对setState()的调用中进行异步工作,首先执行工作   (不更新窗口小部件状态),然后同步更新   调用setState()的内部状态

2 个答案:

答案 0 :(得分:1)

是:

headers: {'Content-type': 'application/json','Accept': 'application/json'}

答案 1 :(得分:0)

由于candidateAuth返回Future,因此您需要添加await

Candidate newPost = new Candidate(
  lastname: lastname,
  firstname: firstname,
  email: email,
);
var candidate = await Candidate().candidateAuth(body: newPost.toMap());

UPD:

根据错误消息,从async中删除setState

onPressed: () async {
  if (_formKey.currentState.validate()) {
    Candidate newPost = new Candidate(
        lastname: lastname,
        firstname: firstname,
        email: email,);
    var candidate = await Candidate().candidateAuth(body: newPost.toMap());

    setState(() {
      // do what you need with candidate here
    });
  }   
},