skip to Main Content

I’m trying to pass the data of a List for another screen but i don’t know how to do that.
I’ve tried using constructors and using correctly null-safety but the app returned this error: Null check operator used on a null Value. And i’m a long time already trying to solve this problem but i don’t know how. What’s the benefits of null safety? Here’s the code:
Code 1

import 'dart:convert';
import 'dart:io';

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mood3/telas/RecebeDados.dart';
import 'package:mood3/telas/listas.dart';
import 'package:path_provider/path_provider.dart';
import 'package:toast/toast.dart';
import 'Diary.dart';

class Escrita extends StatefulWidget {


  List? lista = [];
  Escrita({this.lista});


  @override
  State<Escrita> createState() => _EscritaState();
}

class _EscritaState extends State<Escrita> {




  Future<File>_getFile()async{
    final diretorio = await getApplicationDocumentsDirectory();
    return File("${diretorio.path}/dados.json");
  }

  _salvar() async {
    var arquivo = await _getFile();

    Map<String,dynamic> tarefa = Map();
    tarefa["titulo"] = "Ir ao mercado";
    tarefa["realizada"] = false;
    widget.lista!.add(tarefa);


    String dados = json.encode(widget.lista);
    arquivo.writeAsString(dados);
  }

  _ler() async {

    try{
      final arquivo = await _getFile();
      return arquivo.readAsString();
    }catch(e){
      return null;
    }
  }



  @override
  void initState() {
    super.initState();
    _ler().then((dados){
      setState(() {
        widget.lista = json.decode(dados);
      });
    });
  }


  TextEditingController _controllerTarefa = TextEditingController();





  @override
  Widget build(BuildContext context) {
    ToastContext().init(context);

    return Scaffold(
      body: Center(
        child: SingleChildScrollView(
          child:Column(
          children: [
            Padding(
              padding: EdgeInsets.symmetric(horizontal: 8, vertical: 16),
                child: TextField(
                  keyboardType: TextInputType.multiline,
                  controller: _controllerTarefa,
                  decoration: InputDecoration(
                    hintText: "Diary Title",
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(8),
                      borderSide: BorderSide.none,
                    ),
                    filled: true,
                    fillColor: Colors.blueGrey,
                  ),
                )),
            Padding(
                padding: EdgeInsets.symmetric(horizontal: 8, vertical: 16),
              child: TextField(
                      keyboardType: TextInputType.multiline,
                maxLines: null,
                      decoration: InputDecoration(
                        hintText: "Diary Text",
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(8),
                          borderSide: BorderSide.none,
                        ),
                        filled: true,
                        fillColor: Colors.blueGrey,
                      ),
                  ),),

          ],
        ),),
      ),
            }
          ),

        ]
    ),


    );
  }
}

Code 2:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_speed_dial/flutter_speed_dial.dart';
import 'package:mood3/telas/Account.dart';
import 'package:mood3/telas/Diary.dart';
import 'package:mood3/telas/Friends.dart';
import 'package:mood3/telas/Graph.dart';
import 'package:mood3/telas/Home.dart';
import 'package:mood3/telas/Music.dart';
import 'package:mood3/telas/PlayerDoVideo.dart';
import 'package:mood3/telas/Videos.dart';
import 'package:mood3/telas/animacao.dart';
import 'package:mood3/telas/escrita.dart';
import 'package:persistent_bottom_nav_bar_v2/persistent-tab-view.dart';


class RecebeDados extends StatefulWidget {



  @override
  State<RecebeDados> createState() => _RecebeDadosState();
}

class _RecebeDadosState extends State<RecebeDados> {

  Escrita flista = Escrita();

  late List? list = flista.lista;




  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
                itemCount: list!.length,
                itemBuilder: (context, index){

                  return ListTile(
                    title: Text( list![index]['titulo'] ),
                  );

                }
            ),
          )
        ],
      ),

      floatingActionButton: SpeedDial(
          animatedIcon: AnimatedIcons.menu_close,
          backgroundColor: Colors.black,
          icon: CupertinoIcons.pencil,
          overlayColor: Colors.black,
          children: [
Text ("teste")
          ]
      ),

    );
  }
}


2

Answers


  1. In this case you are creating "lista" as a List that could be null (List?), but also you initialize it with value: a empty list ( [] )

    List? lista = [];
    

    But when you call the constructor of Escrita, you are giving a value to the lista variable.

    Widget myWidget = Escrita(); /// lista is null
    

    lista is null, because you are not indicating a value in the constructor.

    If you want a default value this is the correct way:

    Escrita({this.lista = []});
    

    You are receiving errors because you are using list!.length and list![index][‘titulo’], and using the ! you are asecuring that the list is not null, but yes, its null! So thats the reason because you are receiving the error.

    Login or Signup to reply.
  2. You can solve your problem in this way:

    class Escrita extends StatefulWidget {
    
    
      List lista;
      Escrita({this.lista=[]});
    
    
      @override
      State<Escrita> createState() => _EscritaState();
    }
    

    Or you can do this:

    class Escrita extends StatefulWidget {
    
    
      List lista;
      Escrita({required this.lista});
    
    
      @override
      State<Escrita> createState() => _EscritaState();
    }
    

    Or

    class Escrita extends StatefulWidget {
        
          List lista;
          Escrita(this.lista);
        
        
          @override
          State<Escrita> createState() => _EscritaState();
        }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search