Тип аргумента «Объект?» не может быть присвоен типу параметра «Список»

#flutter #dart

Вопрос:

В более старой версии flutter sdk приведенный ниже пример работает, но теперь у меня ошибка, тип аргумента ‘Object?’ не может быть присвоен типу параметра ‘List’

 FutureBuilder(
        future: fetchEmp(),
        builder: (context, snapshot) {
          return snapshot.hasData
              ? RecommandEmp(emps: snapshot.data)  ---Here is problem!!!
              : Center(child: Image.asset('assets/images/no.png'));
        },
    ),



    class RecommandEmp extends StatefulWidget {
    
      const RecommandEmp({Key? key, required this.emps}) : super(key: key);
    
      final List<Emp> emps;
      @override
      _RecommandEmpState createState() => _RecommandEmpState();
    }
 

fetchEmp

 Future<List<Emp>> fetchEmp() async {

  final response = await http.get(Uri.https(myUrl, 'select/emp'));

  if (response.statusCode == 200) {

    List<Emp> emp = (json.decode(utf8.decode(response.bodyBytes))["items"]  as List)
        .map((data) => Emp.fromJson(data))
        .toList();
    return emp;
  } else {

    throw Exception('Error!');
  }
}
 

модель —> https://ibb.co/zr7H8v2

Комментарии:

1. Можете ли вы отладить emp значение в fetchEmp() ? Возможно, при получении данных возникает проблема. Потому что, если emp это список, эта ошибка не должна отображаться

2. @MiguelEscobarCalderon При использовании print(emp[2].ename); в fetchEmp получить значение ename .

Ответ №1:

snapshot.data по умолчанию всегда будет тип Object , если вы не укажете тип, что можно сделать двумя различными способами

Сначала, как показано ниже

 FutureBuilder<List<Emp>>(
      future: fetchEmp(),
      builder: (context, snapshot) {
        return snapshot.hasData
            ? RecommandEmp(emps: snapshot!.data) 
            : Center(child: Image.asset('assets/images/no.png'));
      },
    ),
 

или второй (для маловероятного случая, когда вы не уверены в своем типе, т.Е. возвращает dynamic) :

 FutureBuilder(
      future: fetchEmp(),
      builder: (context, snapshot) {
        return snapshot.hasData amp;amp; snapshot is List<Emp>
            ? RecommandEmp(emps: snapshot.data as List<Emp>) 
            : Center(child: Image.asset('assets/images/no.png'));
      },
    ),
 

Ответ №2:

Метод groupedTransactionValues возвращает карту объекта. Вместо этого возвращайте сопоставление dynamic , тип которого определяется во время выполнения. Измените строку:

 List<Map<String, Object>> get groupedTransactionValues {
 

Для:

 List<Map<String, dynamic>> get groupedTransactionValues {