Как попасть на страницу сведений о моих сообщениях flutter / REST?

#json #flutter #rest #dart

Вопрос:

Я постоянно получаю одну и ту же ошибку:

При обработке жеста был выдан следующий _CastError: оператор проверки Null, используемый для нулевого значения

Я перепробовал здесь все: конечная функция пустоты(Место)? Место для установки ручки;

Убрал знак вопроса ? и добавил required : не сработало

 final void Function(Place)? handleOpenPlace; // open place with id  final Listlt;Placegt;? places;  CustomListTileView({Key? key, this.handleOpenPlace, this.places}) : super();  final String apiURL = 'https://mywebsite/api/';   Futurelt;Listlt;ParseJSONgt;gt; fetchJSON() async {  var jsonResponse = await http.get(Uri.parse(apiURL));   if (jsonResponse.statusCode == 200) {  final jsonItems =  json.decode(jsonResponse.body).castlt;Maplt;String, dynamicgt;gt;();   Listlt;ParseJSONgt; tempList = jsonItems.maplt;ParseJSONgt;((json) {  return ParseJSON.fromJson(json);  }).toList();   return tempList;  } else {  throw Exception('Failed To Load Data');  }  }  

Места, являющиеся списком в Place.dart

И здесь:

 widget.handleOpenPlace!(places![index]);  
  • Удалил ! , но не получилось.
  • Добавлено ? , но не сработало
  • Попробовал изменить их все: не получилось

Полный код карты:

 return Card(  child: ListTile(  title: Text(  items[index].name.toString(),  ),  onTap: () {  widget.handleOpenPlace!(places![index]);  },  subtitle: Text(  items[index].email.toString(),  ),  leading: CircleAvatar(  backgroundColor: Colors.green,  child: Text(items[index].name.toString()[0],  style: TextStyle(  color: Colors.red,  fontSize: 21.0,  )),  ),  ));  

Что я здесь делаю не так? Перечисление сообщений работает, но в тот момент, когда я хочу перейти на страницу сведений, это не удается.

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

1. Попробуйте сократить использование ! оператора bang. Я все еще скучаю по частям вашего кода, что это за places переменная ? Очевидно , что вы получаете ошибку от onTap , и это означает, что либо handleOpenPlace функция есть null , либо places есть null .

2. Это места: окончательный списокlt;Местоgt;? места; Это работает? Я не знаю, как я мог бы сделать это не нулевым…

3. Можете ли вы показать CustomListTileView реализацию ?

4. Я так и сделал, это в посте или вам нужно что-то конкретное?

5. Я имею в виду, покажите мне, как вы это называете, я хочу посмотреть, как вы передаете параметры.

Ответ №1:

Не могли бы вы, пожалуйста, попробовать сделать handleOpenPlace amp; places required ?

 final void Function(Place) handleOpenPlace; // open place with id final Listlt;Placegt; places; CustomListTileView({Key? key,required this.handleOpenPlace,required this.places}) : super();  

И снимите челку ! с onTap

 onTap: () {  widget.handleOpenPlace(places[index]); },  

Таким образом, вы будете в большей безопасности null и, по крайней мере, сможете разобраться с источником null броска.

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

1. Это дает мне: Ошибка: Должен быть указан требуемый именованный параметр ‘handleOpenPlace’ и: Контекст: Найден этот кандидат, но аргументы не совпадают.

2. Да, это нормально, потому что теперь вы должны предоставить их, когда вы впервые создаете свой CustomListTileView . Я все еще не могу понять, как вы называете виджет, CustomListTileView(places:..., handleOpenPlace:...) .