【问题标题】:Flutter - Data from json api to be listed in drop down listFlutter - 来自 json api 的数据将列在下拉列表中
【发布时间】:2019-02-04 10:17:17
【问题描述】:

我正在尝试从 json api 获取数据并列在下拉列表中,但我遇到 The method 'map' was called on null 错误。

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

void main() => runApp(MaterialApp(
      title: "Hospital Management",
      home: MyApp(),
    ));

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _mySelection;

  final String url = "http://webmyls.com/php/getdata.php";

  List data;

  Future<String> getSWData() async {
    var res = await http
        .get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
    var resBody = json.decode(res.body);

    setState(() {
      data = resBody;
    });

    print(resBody);

    return "Sucess";
  }

  @override
  void initState() {
    super.initState();
    this.getSWData();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: Text("Hospital Management"),
      ),
      body: new Center(
        child: new DropdownButton(
          items: data.map((item) {
            return new DropdownMenuItem(
              child: new Text(item['item_name']),
              value: item['id'].toString(),
            );
          }).toList(),
          onChanged: (newVal) {
            setState(() {
              _mySelection = newVal;
            });
          },
          value: _mySelection,
        ),
      ),
    );
  }
}

调试控制台的错误

flutter: The method 'map' was called on null.
flutter: Receiver: null
flutter: Tried calling: map<DropdownMenuItem<String>>(Closure: 
(dynamic) => DropdownMenuItem<String>)
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      Object.noSuchMethod 
(dart:core/runtime/libobject_patch.dart:48:5)

我希望在下拉菜单中显示来自 json api 的数据列表。我是飞镖和颤振的初学者。帮我解决这个错误。

【问题讨论】:

    标签: dart flutter flutter-dependencies


    【解决方案1】:

    data 未初始化。它设置在getSWData 上,即async

    一种可能的解决方案是将data 作为emptyList 作为初始值。

    List data = List();
    

    如果你想根据数据显示DropdownButton,你可以使用FutureBuilder并显示loader之类的东西,直到数据来自getSWData

    【讨论】:

    • 感谢您的建议。你能帮我更新一下代码吗?我是 Flutter 和 dart 的新手。
    【解决方案2】:

    您的 Api http://webmyls.com/php/getdata.php 返回列表而不是地图。因此,它不能具有直接属性advisor_report。考虑删除它。

    数据应该在setState内部改变。

    你从来没有打电话给getSWData()

    下面是更多改进的例子。

    import "package:flutter/material.dart";
    import 'dart:async';
    import 'dart:convert';
    import 'package:http/http.dart' as http;
    
    void main() => runApp(MaterialApp(
          title: "Hospital Management",
          home: MyApp(),
        ));
    
    class MyApp extends StatefulWidget {
      @override
      _MyAppState createState() => _MyAppState();
    }
    
    class _MyAppState extends State<MyApp> {
      String _mySelection;
    
      final String url = "http://webmyls.com/php/getdata.php";
    
      List data;
    
      Future<String> getSWData() async {
        var res = await http
            .get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
        var resBody = json.decode(res.body);
    
        setState(() {
          data = resBody;
        });
    
        print(resBody);
    
        return "Sucess";
      }
    
      @override
      void initState() {
        super.initState();
        this.getSWData();
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          appBar: AppBar(
            title: Text("Hospital Management"),
          ),
          body: new Center(
            child: new DropdownButton(
              items: data.map((item) {
                return new DropdownMenuItem(
                  child: new Text(item['item_name']),
                  value: item['id'].toString(),
                );
              }).toList(),
              onChanged: (newVal) {
                setState(() {
                  _mySelection = newVal;
                });
              },
              value: _mySelection,
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 感谢您提供的信息。我尝试更新您的 cmets 中提到的代码,但我仍然面临同样的错误。
    • 我使用了与您在回答中提到的相同的代码
    猜你喜欢
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2021-09-25
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多