тип «Null» не является подтипом типа «Строка» в приведенном типе

#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" ,