【问题标题】:How can I resolve "The argument type 'String' can't be assigned to the parameter type 'int' " - Flutter如何解决“参数类型'String'不能分配给参数类型'int'” - Flutter
【发布时间】:2019-09-23 12:49:02
【问题描述】:

我正在尝试使用带有 Flutter SDK 的 HTTP GET 在线获取数据。我正在尝试使用此代码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),
     ),

这是我的 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";
  }
 }

【问题讨论】:

  • data 的类型为 List&lt;String&gt;data[index]['name'] 应该是什么?

标签: dart flutter


【解决方案1】:

如果您只是将 .toSting() 添加到您的列表中,如下所示,它将消除错误。

new Card(
     child: new Container(
     child: new Text(data[index]['name'].toString()), //This line
     padding: EdgeInsets.all(20),
),

【讨论】:

  • 这样的答案已经存在
【解决方案2】:

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

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

不错

【讨论】:

    【解决方案3】:

    这个可以工作

    String url = '$api?lat=$latitude&lon=$longitude&APPID=$appId';
     http.Response response = await http.get(Uri.parse(url));
    

    【讨论】:

      【解决方案4】:

      这对我有用

       http.Response respobse= await 
            http.get(Uri.parse("https://jsonplaceholder.typicode.com/photos"));
          
          Uri.parse(json Url);
      

      使用这个。

      【讨论】:

        【解决方案5】:

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

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

        所以:

        new Card(
             child: new Container(
             child: new Text(data[index]['name'].toString()), //you'll no longer get an error
             padding: EdgeInsets.all(20),
             ),
        

        【讨论】:

          【解决方案6】:

          这对我有用

          void getData() async {
            Response response = await 
            http.get(Uri.parse("https://jsonplaceholder.typicode.com/todos/1"));
            print(response.body);
          }
          

          【讨论】:

            【解决方案7】:

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

            我遇到了同样的问题,我用这种方法解决了它:

            var url = Uri.parse("https://your_api_link");
            

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

            http.Response response = await http.get(url);
            

            这应该可行。

            【讨论】:

            • 好吧,我真的不知道原因,也许String 无法再处理 URL 值,因为在检索 url 数据时采用了异步模式。但我认为其他人在这里可能有更好的理由。
            【解决方案8】:

            这对我有用

            http.get(Uri.https('https://swapi.co', 'api/people'));
            

            http.get(Uri.parse('https://swapi.co/api/people'));
            

            【讨论】:

            【解决方案9】:

            var response = await http.get(Uri.parse(url));

            【讨论】:

            • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请编辑您的答案以添加一些解释,包括您所做的假设。
            【解决方案10】:

            你可以这样用

            Future<http.Response> fetchAlbum() {return http.get(Uri.https('jsonplaceholder.typicode.com', 'albums/1'));}
            

            【讨论】:

              【解决方案11】:

              您必须将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";
                }
              }
              

              【讨论】:

              • 如果你解释了原因,这个答案会更完整
              • 无法将参数类型“String”分配给参数类型“Uri”。
              【解决方案12】:

              记录器应该说明错误在哪一行,所以我不会下载你的代码来尝试找到它。

              您需要做的就是将 String 值转换为整数。当你找到应该是整数的值时,使用:

              int.parse(VALUE)
              

              这是一个参考:https://code-maven.com/slides/dart-programming/casting-string-to-int

              【讨论】:

              • int.parse('name') 在这里没有帮助。
              猜你喜欢
              • 2021-12-10
              • 1970-01-01
              • 2021-10-18
              • 2021-10-17
              • 2021-11-06
              • 2022-10-12
              • 2023-04-05
              • 1970-01-01
              • 2021-10-02
              相关资源
              最近更新 更多