Null check operator used on a null value Carousel Flutter

8,679

Solution 1

I forked the library to create a custom carousel for my company's project, and since we updated flutter to 2.x we had the same problem.

To fix this just update boolean expressions like

if(carouselState.pageController.position.minScrollExtent == null ||
carouselState.pageController.position.maxScrollExtent == null){ ... }

to

if(!carouselState.pageController.position.hasContentDimensions){ ... }

Here is flutter's github reference.

Solution 2

This worked for me

So I edited scrollposition.dart package

from line 133

@override    
//double get minScrollExtent => _minScrollExtent!;    
// double? _minScrollExtent;    
double get minScrollExtent {    
if (_minScrollExtent == null) {    
    _minScrollExtent = 0.0;    
    }    
return double.parse(_minScrollExtent.toString());    
}    
double? _minScrollExtent;    
@override    
// double get maxScrollExtent => _maxScrollExtent!;    
// double? _maxScrollExtent;    
double get maxScrollExtent {    
if (_maxScrollExtent == null) {    
     _maxScrollExtent = 0.0;    
    }    
return double.parse(_maxScrollExtent.toString());    
}    
double? _maxScrollExtent;

Solution 3

Just upgrade to ^3.0.0 Check here https://pub.dev/packages/carousel_slider

Share:
8,679
Admin
Author by

Admin

Updated on December 25, 2022

Comments

  • Admin
    Admin over 1 year

    Good Morning, I'm trying to put a Carousel on the home page looking for Firebase data, but for some reason, the first time I load the application it appears the message below:

    ════════ Exception caught by widgets library ═════════════════════════════════════ ══════════════════
    The following _CastError was thrown building DotsIndicator (animation: PageController # 734f9 (one client, offset 0.0), dirty, state: _AnimatedState # 636ca):
    Null check operator used on a null value
    

    and the screen looks like this:

    Screen Fail

    After giving a hot reload the error continues to appear, but the image is loaded successfully, any tips of what I can do?

    Screen Ok

    HomeManager:

    import 'package:cloud_firestore/cloud_firestore.dart';
    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'package:provantagens_app/models/section.dart';
    
    class HomeManager extends ChangeNotifier{
      HomeManager({this.images}){
        _loadSections();
        images = images ?? [];
      }
    
    
      void addSection(Section section){
        _editingSections.add(section);
        notifyListeners();
      }
    
    
    
      final List<dynamic> _sections = [];
      List<String> images;
      List<dynamic> newImages;
      List<dynamic> _editingSections = [];
    
      bool editing = false;
      bool loading = false;
      int index, totalItems;
    
    
    
    
      final Firestore firestore = Firestore.instance;
    
    
      Future<void> _loadSections() async{
        loading = true;
        firestore.collection('home').snapshots().listen((snapshot){
          _sections.clear();
          for(final DocumentSnapshot document in snapshot.documents){
            _sections.add( Section.fromDocument(document));
           images = List<String>.from(document.data['images'] as List<dynamic>);
          }
        });
        loading = false;
        notifyListeners();
    
      }
    
      List<dynamic>  get sections {
        if(editing)
          return _editingSections;
        else
          return _sections;
      }
    
      void enterEditing({Section section}){
        editing = true;
    
        _editingSections = _sections.map((s) => s.clone()).toList();
    
        defineIndex(section: section);
    
        notifyListeners();
      }
    
    
      void saveEditing() async{
        bool valid = true;
        for(final section in _editingSections){
          if(!section.valid()) valid = false;
        }
        if(!valid) return;
        loading = true;
        notifyListeners();
    
    
        for(final section in _editingSections){
          await section.save();
        }
    
        for(final section in List.from(_sections)){
          if(!_editingSections.any((s) => s.id == section.id)){
            await section.delete();
          }
        }
    
        loading = false;
        editing = false;
        notifyListeners();
      }
    
      void discardEditing(){
        editing = false;
        notifyListeners();
      }
    
      void removeSection(Section section){
        _editingSections.remove(section);
        notifyListeners();
      }
    
      void onMoveUp(Section section){
        int index = _editingSections.indexOf(section);
    
        if(index != 0) {
          _editingSections.remove(section);
          _editingSections.insert(index - 1, section);
          index = _editingSections.indexOf(section);
        }
        notifyListeners();
      }
    
      HomeManager clone(){
        return HomeManager(
          images: List.from(images),
    
        );
      }
    
    
    
      void onMoveDown(Section section){
    
        index = _editingSections.indexOf(section);
        totalItems = _editingSections.length;
        if(index < totalItems - 1){
          _editingSections.remove(section);
          _editingSections.insert(index + 1, section);
          index = _editingSections.indexOf(section);
        }else{
        }
        notifyListeners();
      }
    
      void defineIndex({Section section}){
        index = _editingSections.indexOf(section);
        totalItems = _editingSections.length;
        notifyListeners();
      }
    }
    

    HomeScreen:

    import 'package:carousel_pro/carousel_pro.dart';
    import 'package:flutter/material.dart';
    import 'package:provantagens_app/commom/custom_drawer.dart';
    import 'package:provantagens_app/commom/custom_icons_icons.dart';
    import 'package:provantagens_app/models/home_manager.dart';
    import 'package:provantagens_app/models/section.dart';
    import 'package:provantagens_app/screens/home/components/home_carousel.dart';
    import 'package:provantagens_app/screens/home/components/menu_icon_tile.dart';
    import 'package:provider/provider.dart';
    import 'package:url_launcher/url_launcher.dart';
    
    
    // ignore: must_be_immutable
    class HomeScreen extends StatelessWidget {
    
      HomeManager homeManager;
      Section section;
      List<Widget> get children => null;
      String videoUrl = 'https://www.youtube.com/watch?v=VFnDo3JUzjs';
      int index;
      var _tapPosition;
    
    
      @override
      Widget build(BuildContext context) {
        return Container(
          decoration: BoxDecoration(
              gradient: LinearGradient(colors: const [
                Colors.white,
                Colors.white,
              ], begin: Alignment.topCenter, end: Alignment.bottomCenter)),
          child: Scaffold(
              backgroundColor: Colors.transparent,
              drawer: CustomDrawer(),
              appBar: AppBar(
                backgroundColor: Colors.transparent,
                iconTheme: IconThemeData(color: Colors.black),
                title: Text('Página inicial', style: TextStyle(color: Color.fromARGB(255, 30, 158, 8))),
                centerTitle: true,
                actions: <Widget>[
                  Divider(),
                ],
              ),
              body: Consumer<HomeManager>(
                builder: (_, homeManager, __){
                  return ListView(children: <Widget>[
                    AspectRatio(
                      aspectRatio: 1,
                      child:HomeCarousel(homeManager),
                    ),
                    Column(
                      children: <Widget>[
                        Container(
                          height: 50,
                        ),
                        Divider(
                          color: Colors.black,
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceAround,
                          children: [
                            Padding(
                              padding: const EdgeInsets.only(left:12.0),
                              child: MenuIconTile(title: 'Parceiros', iconData: Icons.apartment, page: 1,),
                            ),
                            Padding(
                              padding: const EdgeInsets.only(left:7.0),
                              child: MenuIconTile(title: 'Beneficios', iconData: Icons.card_giftcard, page: 2,),
                            ),
                            Padding(
                              padding: const EdgeInsets.only(right:3.0),
                              child: MenuIconTile(title: 'Suporte', iconData: Icons.help_outline, page: 6,),
                            ),
                          ],
                        ),
                        Row(
                          mainAxisAlignment: MainAxisAlignment.spaceAround,
                          children: [
                            MenuIconTile(iconData: Icons.assignment,
                                title: 'Dados pessoais',
                                page: 3)
                            ,
                            MenuIconTile(iconData: Icons.credit_card_outlined,
                                title: 'Meu cartão',
                                page: 4)
                            ,
                            MenuIconTile(iconData: Icons.account_balance_wallet_outlined,
                              title: 'Pagamento',
                              page: 5,)
                            ,
                          ],
                        ),
                        Divider(
                          color: Colors.black,
                        ),
                        Container(
                          height: 50,
                        ),
                        Consumer<HomeManager>(
                          builder: (_, sec, __){
                            return RaisedButton(
                              child: Text('Teste'),
                              onPressed: (){
                                Navigator.of(context)
                                    .pushReplacementNamed('/teste',
                                    arguments: sec);
                              },
                            );
                          },
                        ),
                        Text('Saiba onde usar o seu', style: TextStyle(color: Colors.black, fontSize: 20),),
                        Text('Cartão Pró Vantagens', style: TextStyle(color: Color.fromARGB(255, 30, 158, 8), fontSize: 30),),
                        AspectRatio(
                          aspectRatio: 1,
                          child: Image.network(
                            'https://static.wixstatic.com/media/d170e1_80b5f6510f5841c19046f1ed5bca71e4~mv2.png/v1/fill/w_745,h_595,al_c,q_90,usm_0.66_1.00_0.01/Arte_Cart%C3%83%C2%B5es.webp',
                            fit: BoxFit.fill,
                          ),
                        ),
                        Divider(),
                        Container(
                          height: 150,
                          child: Row(
                            children: [
                              AspectRatio(
                                aspectRatio: 1,
                                child: Image.network(
                                  'https://static.wixstatic.com/media/d170e1_486dd638987b4ef48d12a4bafee20e80~mv2.png/v1/fill/w_684,h_547,al_c,q_90,usm_0.66_1.00_0.01/Arte_Cart%C3%83%C2%B5es_2.webp',
                                  fit: BoxFit.fill,
                                ),
                              ),
                              Padding(
                                padding: const EdgeInsets.only(left:20.0),
                                child: RichText(
                                  text: TextSpan(children: <TextSpan>[
                                    TextSpan(
                                      text: 'Adquira já o seu',
                                      style: TextStyle(
                                        fontSize: 20.0,
                                        fontWeight: FontWeight.bold,
                                        color: Colors.black,
                                      ),
                                    ),
                                    TextSpan(
                                      text: '\n\CARTÃO PRÓ VANTAGENS',
                                      style: TextStyle(
                                          fontSize: 15.0,
                                          fontWeight: FontWeight.bold,
                                          color: Color.fromARGB(255, 30, 158, 8)),
                                    ),
                                  ]),
                                ),
                              ),
                            ],
                          ),
                        ),
                        Divider(),
                        tableBeneficios(),
                        Divider(),
                        Padding(
                          padding: const EdgeInsets.all(16.0),
                          child: Column(
                            children: [
                              Text(
                                  'O cartão Pró-Vantagens é sediado na cidade de Hortolândia/SP e já está no mercado há mais de 3 anos. Somos um time de profissionais apaixonados por gestão de benefícios e empenhados em gerar o máximo de valor para os conveniados.'),
                              FlatButton(
                                  onPressed: () {
                                    launch(
                                        'https://www.youtube.com/watch?v=VFnDo3JUzjs');
                                  },
                                  child: Text('SAIBA MAIS')),
                            ],
                          ),
                        ),
                        Container(
                          color: Color.fromARGB(255, 105, 190, 90),
                          child: Column(
                            children: <Widget>[
                              Row(
                                children: [
                                  Padding(
                                    padding: const EdgeInsets.all(16),
                                    child: Text(
                                      '©  2020 todos os direitos reservados a Cartão Pró Vantagens.',
                                      style: TextStyle(fontSize: 10),
                                    ),
                                  )
                                ],
                              ),
                              Divider(),
                              Row(
                                children: [
                                  Padding(
                                    padding: const EdgeInsets.all(16),
                                    child: Text(
                                      'Rua Luís Camilo de Camargo, 175 -\n\Centro, Hortolândia (piso superior)',
                                      style: TextStyle(fontSize: 10),
                                    ),
                                  ),
                                  Padding(
                                    padding: const EdgeInsets.only(left: 16),
                                    child: IconButton(
                                      icon: Icon(CustomIcons.facebook),
                                      color: Colors.black,
                                      onPressed: () {
                                        launch(
                                            'https://www.facebook.com/provantagens/');
                                      },
                                    ),
                                  ),
                                  Padding(
                                    padding: const EdgeInsets.only(left: 16),
                                    child: IconButton(
                                      icon: Icon(CustomIcons.instagram),
                                      color: Colors.black,
                                      onPressed: () {
                                        launch(
                                            'https://www.instagram.com/cartaoprovantagens/');
                                      },
                                    ),
                                  ),
                                ],
                              ),
                            ],
                          ),
                        )
                      ],
                    ),
                  ]);
                },
              )
              ),
    
        );
      }
    
      tableBeneficios() {
        return Table(
          defaultColumnWidth: FlexColumnWidth(120.0),
          border: TableBorder(
            horizontalInside: BorderSide(
              color: Colors.black,
              style: BorderStyle.solid,
              width: 1.0,
            ),
            verticalInside: BorderSide(
              color: Colors.black,
              style: BorderStyle.solid,
              width: 1.0,
            ),
          ),
          children: [
            _criarTituloTable(",Plus, Premium"),
            _criarLinhaTable("Seguro de vida\n\(Morte Acidental),X,X"),
            _criarLinhaTable("Seguro de Vida\n\(Qualquer natureza),,X"),
            _criarLinhaTable("Invalidez Total e Parcial,X,X"),
            _criarLinhaTable("Assistência Residencial,X,X"),
            _criarLinhaTable("Assistência Funeral,X,X"),
            _criarLinhaTable("Assistência Pet,X,X"),
            _criarLinhaTable("Assistência Natalidade,X,X"),
            _criarLinhaTable("Assistência Eletroassist,X,X"),
            _criarLinhaTable("Assistência Alimentação,X,X"),
            _criarLinhaTable("Descontos em Parceiros,X,X"),
          ],
        );
      }
    
      _criarLinhaTable(String listaNomes) {
        return TableRow(
          children: listaNomes.split(',').map((name) {
            return Container(
              alignment: Alignment.center,
              child: RichText(
                text: TextSpan(children: <TextSpan>[
                  TextSpan(
                    text: name != "X" ? '' : 'X',
                    style: TextStyle(
                      fontSize: 20.0,
                      fontWeight: FontWeight.bold,
                      color: Colors.black,
                    ),
                  ),
                  TextSpan(
                    text: name != 'X' ? name : '',
                    style: TextStyle(
                        fontSize: 10.0,
                        fontWeight: FontWeight.bold,
                        color: Color.fromARGB(255, 30, 158, 8)),
                  ),
                ]),
              ),
              padding: EdgeInsets.all(8.0),
            );
          }).toList(),
        );
      }
    
      _criarTituloTable(String listaNomes) {
        return TableRow(
          children: listaNomes.split(',').map((name) {
            return Container(
              alignment: Alignment.center,
              child: RichText(
                text: TextSpan(children: <TextSpan>[
                  TextSpan(
                    text: name == "" ? '' : 'Plano ',
                    style: TextStyle(
                      fontSize: 15.0,
                      fontWeight: FontWeight.bold,
                      color: Colors.black,
                    ),
                  ),
                  TextSpan(
                    text: name,
                    style: TextStyle(
                        fontSize: 15.0,
                        fontWeight: FontWeight.bold,
                        color: Color.fromARGB(255, 30, 158, 8)),
                  ),
                ]),
              ),
              padding: EdgeInsets.all(8.0),
            );
          }).toList(),
        );
      }
      void _storePosition(TapDownDetails details) {
        _tapPosition = details.globalPosition;
      }
    }