如何解决“无法将参数类型 'String' 分配给参数类型 'int'” - Flutter

Irf*_*ram 12 dart flutter

我正在尝试使用 HTTP GET 和 Flutter SDK 在线获取数据。我正在尝试使用此代码https://github.com/RaglandCodes/Flutter-basic-API/blob/master/lib/main.dart但它显示有关数据类型的错误

不能将参数类型“String”分配给参数类型“int”

这是错误部分

new Card(
     child: new Container(
     child: new Text(data[index]['name']), //error red underlying with 'name'
     padding: EdgeInsets.all(20),
     ),
Run Code Online (Sandbox Code Playgroud)

这是我的 main.dart

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

void main() {
  runApp(new MaterialApp(home: new HomePage(),));
}

 class HomePage extends StatefulWidget {
   @override
   _HomePageState createState() => _HomePageState();
 }

 class _HomePageState extends State<HomePage> {

  String url="https://swapi.co/api/people/";
  List<String> data;

  /*onCreate*/
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    getJSONData(); //method
  }

   @override
   Widget build(BuildContext context) {
     return new Scaffold(
       appBar: AppBar(
           title: Text("my JSON app")
       ),
       body: new ListView.builder(
        // itemCount: 1,
         //itemCount: data==null ? 0 :data.length ,
         itemCount: data == null ? 0 : data.length,

         itemBuilder: (BuildContext context, int index){
           return new Container(
             child: new Center(
               child: new Column(
                 crossAxisAlignment: CrossAxisAlignment.stretch, 
                 children: <Widget>[
                   new Card(
                     child: new Container(
                       child: new Text(data[index]['name']),
                       padding: EdgeInsets.all(20),
                     ),
                   )
                 ],
               ),
             ),
           );
         },
       ),
     );
   }

   /*method*/ //RT is Future<String>
  Future<String> getJSONData() async{
    var response =await http.get(
      Uri.encodeFull(url),
      headers: {"Accept": "application/json"}
    );
   print(response.body);
   debugPrint(response.body);

    setState(() {
      var convertDataToJson= json.decode(response.body);
      data=convertDataToJson['results'];
    });

    return "Success";
  }
 }
Run Code Online (Sandbox Code Playgroud)

小智 47

这对我有用

http.get(Uri.https('https://swapi.co', 'api/people'));
Run Code Online (Sandbox Code Playgroud)

或者

http.get(Uri.parse('https://swapi.co/api/people'));
Run Code Online (Sandbox Code Playgroud)

  • 对于使用“http:0.13.0”及以上版本的用户来说,这是一个有效的答案。以下是变更日志,其中提到这是一个重大变更:https://pub.dev/packages/http/changelog#0130-nullsafety0 (2认同)

小智 35

如果添加.toString()错误就会消失:

Text(data[index]['name'].toString())

好的


Mou*_*abr 15

您必须将data变量设置为List类型。

那应该有效:

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

void main() {
  runApp(new MaterialApp(
    home: new HomePage(),
  ));
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String url = "https://swapi.co/api/people/";
  List data;

  /*onCreate*/
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    getJSONData(); //method
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("my JSON app")),
      body: new ListView.builder(
        // itemCount: 1,
        //itemCount: data==null ? 0 :data.length ,
        itemCount: data == null ? 0 : data.length,

        itemBuilder: (BuildContext context, int index) {
          return new Container(
            child: new Center(
              child: new Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  new Card(
                    child: new Container(
                      child: new Text(data[index]['name'] ?? ''),
                      padding: EdgeInsets.all(20),
                    ),
                  )
                ],
              ),
            ),
          );
        },
      ),
    );
  }

  /*method*/ //RT is Future<String>
  Future<String> getJSONData() async {
    var response = await http
        .get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
    print(response.body);
    debugPrint(response.body);

    setState(() {
      var convertDataToJson = json.decode(response.body);
      data = convertDataToJson['results'];
    });

    return "Success";
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你解释一下原因,这个答案会更完整 (5认同)

ume*_*alu 12

原因是http.get不能再处理字符串了。您需要使用Uri 来解析 HTTP 地址。

我有同样的问题,我用这种方法修复了它:

var url = Uri.parse("https://your_api_link");
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它(附加http):

http.Response response = await http.get(url);
Run Code Online (Sandbox Code Playgroud)

这应该有效。