Null检查操作符,用于空值(列表)



我试图传递另一个屏幕列表的数据,但我不知道如何做到这一点。我尝试过使用构造函数和正确使用Null -safety,但应用程序返回了这个错误:Null检查操作符用于空值。我已经尝试解决这个问题很长时间了,但我不知道该怎么做。零安全性的好处是什么?代码如下:代码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,
),
),),
],
),),
),
}
),
]
),

);
}
}

代码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")
]
),
);
}
}

在本例中,您创建的是"lista"作为一个可以为空的List (List?),但你也可以用value初始化它:一个空List ([])

List? lista = [];

但是当你调用Escrita的构造函数时,你是在给lista变量一个值。

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

lista为空,因为您没有在构造函数中指示值。

如果你想要一个默认值,这是正确的方法:

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

您正在接收错误,因为您正在使用list!长度和列表![index]['titulo'],并使用!您正在确保列表不是空的,但是,是的,它是空的!这就是你收到错误的原因。

你可以这样解决你的问题:

class Escrita extends StatefulWidget {

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

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

或者你可以这样做:

class Escrita extends StatefulWidget {

List lista;
Escrita({required this.lista});

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

class Escrita extends StatefulWidget {

List lista;
Escrita(this.lista);


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

最新更新