#flutter #api #model
Вопрос:
Я взаимодействую с API, для которого я построил модель. Все работает нормально, но я не могу получить данные. Я получаю эту ошибку-тип «Null» не является подтипом типа «Строка» в приведении типа.
Мне нужно решение этой проблемы, потому что я новичок в Flutter. Это мои коды и скриншоты до сих пор
подключение к API
import 'dart:convert';
import 'package:api_app/model/category.dart';
import 'package:api_app/model/site.dart';
import 'category.dart';
class PostResponse {
String nextUrl;
String prevUrl;
List<Post> posts;
PostResponse({
required this.nextUrl,
required this.prevUrl,
required this.posts,
});
factory PostResponse.fromJson(dynamic json) {
print(json);
return PostResponse(
posts: (json['results'] as List).map((x) => Post.fromJson(x)).toList(),
// posts: [],
nextUrl: json['next'] as String,
prevUrl: json['previous'] as String,
);
}
String postToJson(List<Post> data) {
final dyn = List<dynamic>.from(data.map((x) => x.toJson()));
return json.encode(dyn);
}
}
class Post {
String title;
String content;
String imageUrl;
String url;
Category category;
String author;
Site site;
String uploaded;
Post({
required this.title,
required this.content,
required this.imageUrl,
required this.url,
required this.category,
required this.author,
required this.site,
required this.uploaded,
});
factory Post.fromJson(dynamic json) => Post(
title: json["title"] as String,
content: json["content"] as String,
imageUrl: json["image_url"] as String,
url: json["url"] as String,
category: Category.fromJson(json["category"]),
//author: json["author"] as String ?? 'Admin',
author: json["author"] as String,
site: Site.fromJson(json["site"]),
uploaded: json["uploaded"] as String,
);
Map<String, dynamic> toJson() => {
"title": title,
"content": content,
"image_url": imageUrl,
"url": url,
"category": category.toJson(),
"author": author,
"site": site.toJson(),
"uploaded": uploaded,
};
}
Модель
import 'dart:convert';
import 'package:api_app/model/category.dart';
import 'package:api_app/model/site.dart';
import 'category.dart';
class PostResponse {
String nextUrl;
String prevUrl;
List<Post> posts;
PostResponse({
required this.nextUrl,
required this.prevUrl,
required this.posts,
});
factory PostResponse.fromJson(dynamic json) {
print(json);
return PostResponse(
posts: (json['results'] as List).map((x) => Post.fromJson(x)).toList(),
// posts: [],
nextUrl: json['next'] as String,
prevUrl: json['previous'] as String,
);
}
String postToJson(List<Post> data) {
final dyn = List<dynamic>.from(data.map((x) => x.toJson()));
return json.encode(dyn);
}
}
class Post {
String title;
String content;
String imageUrl;
String url;
Category category;
String author;
Site site;
String uploaded;
Post({
required this.title,
required this.content,
required this.imageUrl,
required this.url,
required this.category,
required this.author,
required this.site,
required this.uploaded,
});
factory Post.fromJson(dynamic json) => Post(
title: json["title"] as String,
content: json["content"] as String,
imageUrl: json["image_url"] as String,
url: json["url"] as String,
category: Category.fromJson(json["category"]),
//author: json["author"] as String ?? 'Admin',
author: json["author"] as String,
site: Site.fromJson(json["site"]),
uploaded: json["uploaded"] as String,
);
Map<String, dynamic> toJson() => {
"title": title,
"content": content,
"image_url": imageUrl,
"url": url,
"category": category.toJson(),
"author": author,
"site": site.toJson(),
"uploaded": uploaded,
};
}
main app
return MaterialApp(
title: 'New Fetch Data',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('News App'),
centerTitle: true,
),
body: Center(
child: FutureBuilder<Post>(
future: _newsModel,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data!.title);
print(snapshot.data!.title);
} else if (snapshot.hasError) {
return Text('${snapshot.error}');
}
return Center(child: CircularProgressIndicator());
},
),
),
),
);
скриншот
Ответ №1:
Ответ может иметь null
значения. Попробуйте указать ваши возможные нулевые переменные как . String?
?
Указывает, что переменная может иметь null
значение
title: json["title"] as String?,
content: json["content"] as String?,
imageUrl: json["image_url"] as String?,
url: json["url"] as String,
category: Category.fromJson(json["category"]),
//author: json["author"] as String ?? 'Admin',
author: json["author"] as String?,
site: Site.fromJson(json["site"]),
uploaded: json["uploaded"] as String?,
А также изменить их в соответствии с типами
String? title;
String? content;
String? author;
...
Комментарии:
1. Ошибка: Тип аргумента «Строка?» не может быть присвоен типу параметра «Строка», потому что «Строка?» может быть обнулена, а «Строка» — нет. возвращаемый текст(снимок.данные! .название);
2. возвращаемый текст(снимок.данные! .название);
3. возвращаемый текст(снимок.данные! .title) в моем главном.dart по извлечению данных в тексте. Тем не менее, я твердо верю, что я должен извлекать данные с помощью результатов из-за моей структуры json
4. верните приложение MaterialApp( заголовок: «Новые данные выборки», тема: Данные темы( Основные часы: Цвета.синий,), главная страница: Каркас( панель приложений: Панель приложений( заголовок: Текст(«Приложение новостей»), заголовок: true,), тело: Центр( дочерний элемент: FutureBuilder<Сообщение>( будущее: _newsModel, конструктор: (контекст, снимок) { если (снимок.hasData) { верните текст(снимок.данные! .заголовок); печать(снимок.данные! .название);
5. Попробуйте добавить
null
проверку внутриText
,Text(snapshot.data!.title ?? '')
Ответ №2:
title: (json["title"] as String)??"",
content: (json["content"] as String)??"",
imageUrl: (json["image_url"]) as String)??"",
url: (json["url"] as String)??"",
category: (Category.fromJson(json["category"]))??"",
//author: json["author"] as String ?? 'Admin',
author: (json["author"] as String)??"",
site: (Site.fromJson(json["site"]))??"",
uploaded: (json["uploaded"] as String)??"",
или вы можете бросить (value: json["KEY"] as dynamic)
и проверить value??"undefined"
,