我试图传递另一个屏幕列表的数据,但我不知道如何做到这一点。我尝试过使用构造函数和正确使用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();
}