Flutter - данные из json api будут перечислены в выпадающем списке - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить данные из json api и попасть в раскрывающийся список, но нажимаю Метод 'map' был вызван при ошибке error.

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 в выпадающем меню. Я начинающий дартс и трепетать. Помогите мне решить ошибку.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Ваш 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,
        ),
      ),
    );
  }
}
0 голосов
/ 29 августа 2018

data не инициализируется. Он установлен на getSWData, что составляет async.

Возможным решением может быть data в качестве emptyList в качестве начального значения.

List data = List();

Если вы хотите отобразить DropdownButton на основе данных, вы можете использовать FutureBuilder и показывать загрузчик или что-то еще, пока данные не поступят из getSWData

...