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

#flutter #dart

Вопрос:

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

Следующий _CastError был брошен при построении StreamBuilder(грязный, состояние: _StreamBuilderBaseState<ArticleResponse, AsyncSnapshot>#39173): оператор проверки Null, используемый для нулевого значения

   import 'package:carousel_slider/carousel_slider.dart';
import 'package:firstapp/bloc/get_top_headlines_bloc.dart';
import 'package:firstapp/elements/error_element.dart';
import 'package:firstapp/elements/loader_element.dart';
import 'package:firstapp/model/article.dart';
import 'package:firstapp/model/article_response.dart';
import 'package:flutter/material.dart';
import 'package:timeago/timeago.dart' as timeago;

class HeadlineSliderWidget extends StatefulWidget {
  const HeadlineSliderWidget({Key? key}) : super(key: key);

  @override
  _HeadlineSliderWidgetState createState() => _HeadlineSliderWidgetState();
}

class _HeadlineSliderWidgetState extends State<HeadlineSliderWidget> {
  @override
  void initState() {
    super.initState();
    getTopHeadlinesBloc..getHeadlines();
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder<ArticleResponse>(
      stream: getTopHeadlinesBloc.subject.stream,
      builder: (context, AsyncSnapshot<ArticleResponse> snapshot) {
        if (snapshot.hasData) {
          if (snapshot.data?.error != null amp;amp; snapshot.data!.error.length > 0) {
            return buildErrorWidget(snapshot.data!.error);
          }
          return _buildHeadlineSliderWidget(snapshot.data!);
        }else if (snapshot.hasError){
          return buildErrorWidget(snapshot.data!.error);
        } else {
          return buildLoadingWidget();
        }
        // if (snapshot.hasData) {
        //  return _buildHeadlineSliderWidget(snapshot.data!);
        // } else if (!snapshot.hasError) {
        //   return buildErrorWidget(snapshot.data!.error);
        // } else {
        //   return buildLoadingWidget();
        // }
      },
    );
  }
  //   ignore: unrelated_type_equality_checks
  //   if (snapshot.hasError !=  snapshot.data!.error.length > 0) {
  //     return buildErrorWidget(snapshot.data!.error);
  //   }
  //   var data = snapshot.data!;
  //   return _buildHeadlineSliderWidget(data);
  // } else if (snapshot.hasError) {
  //   return buildErrorWidget(snapshot.data!.error);
  // } else {
  //   return buildLoadingWidget();

  Widget _buildHeadlineSliderWidget(ArticleResponse data) {
    List<ArticleModel> articles = data.articles;
    return Container(
      child: CarouselSlider(
        options: CarouselOptions(
            enlargeCenterPage: false, height: 200.0, viewportFraction: 0.9),
        items: getExpenseSliders(articles),
      ),
    );
  }

  getExpenseSliders(List<ArticleModel> articles) {
    return articles
        .map(
          (article) => GestureDetector(
            onTap: () {},
            child: Container(
              padding: const EdgeInsets.only(
                  left: 5.0, right: 5.0, top: 10.0, bottom: 10.0),
              child: Stack(
                children: <Widget>[
                  Container(
                    decoration: new BoxDecoration(
                      borderRadius: BorderRadius.all(Radius.circular(8.0)),
                      shape: BoxShape.rectangle,
                      image: new DecorationImage(
                          fit: BoxFit.cover,
                          // ignore: unrelated_type_equality_checks
                          image: article.img != String
                              ? NetworkImage(article.img!)
                              : AssetImage("assets/img/placeholder.jpg")
                                  as ImageProvider),
                    ),
                  ),
                  Container(
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.all(Radius.circular(8.0)),
                      gradient: LinearGradient(
                          begin: Alignment.bottomCenter,
                          end: Alignment.topCenter,
                          stops: [
                            0.1,
                            0.9
                          ],
                          colors: [
                            Colors.black.withOpacity(0.9),
                            Colors.white.withOpacity(0.0)
                          ]),
                    ),
                  ),
                  Positioned(
                      bottom: 30.0,
                      child: Container(
                        padding: EdgeInsets.only(left: 10.0, right: 10.0),
                        width: 250.0,
                        child: Column(
                          children: <Widget>[
                            Text(
                              article.title!,
                              style: TextStyle(
                                  height: 1.5,
                                  color: Colors.white,
                                  fontWeight: FontWeight.bold,
                                  fontSize: 12.0),
                            ),
                          ],
                        ),
                      )),
                  Positioned(
                      bottom: 10.0,
                      left: 10.0,
                      child: Text(
                        article.source.name!,
                        style: TextStyle(color: Colors.white54, fontSize: 9.0),
                      )),
                  Positioned(
                      bottom: 10.0,
                      right: 10.0,
                      child: Text(
                        timeAgo(DateTime.parse(article.date!)),
                        style: TextStyle(color: Colors.white54, fontSize: 9.0),
                      )),
                ],
              ),
            ),
          ),
        )
        .toList();
  }

  String timeAgo(DateTime date) {
    return timeago.format(date, allowFromNow: true, locale: 'en');
  }
}

 

Ответ №1:

если вы на самом деле не опубликуете полную трассировку стека (что вы всегда должны делать), ваша проблема, скорее всего, возникает здесь.

 article.img != String
  ? NetworkImage(article.img!)
  : AssetImage("assets/img/placeholder.jpg") as ImageProvider),
 

если вы хотите проверить тип, который вам нужно сделать article.img is! String , или, что еще лучше, в этом случае просто выполните проверку на нуль article.img != null .

потому что прямо сейчас ваше тернарное утверждение всегда будет оцениваться как true так article.img как оно не совпадает с String классом. поэтому, когда вы это сделаете article.img! , и img будет равен нулю, будет выдана эта ошибка

используя ! оператор, вы говорите компилятору: «эта переменная никогда не будет равна нулю».

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

1. спасибо, что это сработало ! просто прочитайте обновление безопасности null.

2. обязательно отметьте вопрос как ответ для других людей 🙂