Выборка Json из необработанного исключения ошибки api: введите ‘_InternalLinkedHashMap’ не является подтипом типа ‘List’

#json #flutter #dio

#json #flutter #dio

Вопрос:

Здравствуйте, у меня есть один вопрос: я извлекал категории из api, который отлично работает в postman, но на flutter я не использовал класс модели, просто используя dio, мне нужно получить этот json api в виде массива для вертикальной прокрутки категорий в верхней строке.

вот мой ответ postman

 {
    "data": [
        {
            "id": 1,
            "name": "Electronics",
            "color": "#ff8000"
        },
        {
            "id": 2,
            "name": "SpareParts",
            "color": "#00ff40"
        },
        
    ]
}
  

и в flutter я использовал

 getCatagories() async {
    var tokens;

    var dioo = Dio();
    dioo.interceptors
        .add(InterceptorsWrapper(onRequest: (RequestOptions options) async {
      var customHeaders = {
        'content-type': 'application/json',
      };
      options.headers.addAll(customHeaders);
      return options;
    }));

    var response = await dioo.get("https://www.mywebiste.com/api/cat");
    if(response.data.isEmpty||response.data==null)
    {
    }
    else
    {

    }

    return response.data;


  }
  

для извлечения этих категорий
я использовал

 List categories = [];

  @override
  void initState() {
   getCatagories().then((data) {
      setState(() {
         categories = data;
      });
    });
    super.initState();
  }


  // by default first item will be selected


  @override
  Widget build(BuildContext context) {
    return Container(
      margin: EdgeInsets.symmetric(vertical: kDefaultPadding / 2),
      height: 30,
      child: ListView.builder(
        scrollDirection: Axis.horizontal,
        itemCount: categories.length,
        itemBuilder: (context, index) => GestureDetector(
          onTap: () {
            Fluttertoast.showToast(
                msg: "This is Center Short Toast" selectedIndex.toString(),
                toastLength: Toast.LENGTH_SHORT,
                gravity: ToastGravity.CENTER,
                timeInSecForIosWeb: 1,
                backgroundColor: Colors.red,
                textColor: Colors.white,
                fontSize: 16.0
            );
            setState(() {
              selectedIndex = index;
            });
          },
          child: Container(
            alignment: Alignment.center,
            margin: EdgeInsets.only(
              left: kDefaultPadding,
              // At end item it add extra 20 right  padding
              right: index == categories.length - 1 ? kDefaultPadding : 0,
            ),
            padding: EdgeInsets.symmetric(horizontal: kDefaultPadding),
            decoration: BoxDecoration(
              color: index == selectedIndex
                  ? Colors.white.withOpacity(0.4)
                  : Colors.transparent,
              borderRadius: BorderRadius.circular(6),
            ),
            child: Text(
              categories[index],
              style: TextStyle(color: Colors.white),
            ),
          ),
        ),
      ),
    );
  }
  

поэтому, когда я запускаю эти категории приложений, они не отображаются для полосы прокрутки, и ошибка является необработанным исключением: InternalLinkedHashMap<String, dynamic>’ не является подтипом типа ‘List

Ответ №1:

Вы получаете данные из запроса в виде карты и присваиваете их списку. вы должны создать категории в виде карты:

 Map categories;
  

Примечание: не давайте ему обобщений.

после этого у вас возникнут некоторые проблемы в приведенном ниже коде при циклическом переходе по категориям. Это другой вопрос. 🙂