list - Flutter 类成员列表即使在初始化后也返回 null
问题描述
这是一个文件夹模型类:
import 'package:flutter/material.dart';
import 'block_model.dart';
class Folder {
Folder({
this.title = '',
}) {
this.folderContent = this.folderContent ?? <Block>[];
}
String title;
List<Block> folderContent = [];
String id;
void renameFolder(String value) {
title = value;
}
Folder.fromJson(Map<String, dynamic> json) {
this.id = '${json['id']}';
this.title = json['title'];
this.folderContent = json['folderContent'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> folderJson = {};
folderJson['id'] = this.id;
folderJson['title'] = this.title;
folderJson['folderContent'] = this.folderContent;
return folderJson;
}
}
这些文件夹是通过 API 调用创建的,如下所示:
Future<void> createLibraryFolder(String title) async {
const String createFolderURL = '/api/TimelineLibrary/createFolder';
Folder newFolder = Folder(title: title);
var res =
await request.postRequest(newFolder.toJson(), createFolderURL, false);
print(res);
}
还有一个名为“文件夹”的列表,它映射从 Library View API 获取的文件夹。问题是在创建文件夹时 folderContent 列表为空(这很好,应该是)但是当这些 Folder 对象被映射以创建视图时,folderContent 返回 null。这是文件夹视图的代码:
List<Widget> createFolders() {
return _timeLineController.folders.map((Folder folder) {
// if (folder.folderContent == null) {
// folder.folderContent = <Block>[];
// }
Widget folderWidget = Container(
width: 300,
margin: const EdgeInsets.all(3),
child: FolderWidget(folder: folder),
);
return GestureDetector(
onLongPressStart: (LongPressStartDetails details) {
showMenu(
color: kLightAccent,
context: context,
position: RelativeRect.fromLTRB(
details.globalPosition.dx,
details.globalPosition.dy,
details.globalPosition.dx,
details.globalPosition.dy),
items: <PopupMenuEntry<String>>[
PopupMenuItem(
value: 'Menu',
child: MenuItem(
'Edit',
() {
Navigator.pop(context);
},
),
),
],
);
},
onPanUpdate: (DragUpdateDetails dragDetails) {
if (dragDetails.delta.dx > 0) {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Delete Folder?'),
content: Container(
height: 50,
width: 50,
alignment: Alignment.center,
child: Row(
children: <Widget>[
Spacer(),
ElevatedButton(
style: ButtonStyle(
backgroundColor:
MaterialStateProperty.all<Color>(kOrange),
foregroundColor:
MaterialStateProperty.all<Color>(
Colors.white),
),
onPressed: () async {
Navigator.pop(context);
await deleteLibraryFolder(folder.id);
},
child: Text('Yes')),
SizedBox(width: 10),
ElevatedButton(
style: ButtonStyle(
backgroundColor:
MaterialStateProperty.all<Color>(kOrange),
foregroundColor:
MaterialStateProperty.all<Color>(
Colors.white),
),
onPressed: () {
Navigator.pop(context);
},
child: Text('No')),
],
),
),
);
});
}
},
onTap: () {
folderID = folder.id;
setState(() {
isCheck = true;
});
},
child: folderWidget,
);
}).toList();
}
当这些文件夹如上所示被映射时,folderContent 为空,这不应该根据类模型中完成的初始化。我尝试将 folderContent 初始化为一个空列表(请参阅 FolderView 中的注释代码),但这不符合我的要求,因为每次重建小部件时列表都会变空。当我尝试使用以某种方式将 folderContent 设置为 null 的 map 函数时,就会出现问题。我该如何解决这个问题?
编辑: 调试控制台输出当我尝试创建文件夹时:
I/flutter (22459): []
I/flutter (22459): {id: 57}
这表明空列表已初始化,这是我想要的。
I/flutter (22459): 57
I/flutter (22459): test
I/flutter (22459): null
这是当文件夹被映射到“folderContent”为空的列表时。'test' 是文件夹的标题。
解决方案
你能试试这个吗?
Folder({
this.title = '',
this.folderContent = const [],
});
String title;
List<Block> folderContent;
String id;
通常在调用构造函数时检查不需要函数的变量的赋值,可以直接通过构造函数进行。如果您稍后需要使用add
or 修改列表,请检查列表是否为空,如果是,则不要使用add
use =
。
推荐阅读
- sql-server - 无法在 Scintific Linux 7.5 上使用 pyodbc 连接到 MS SQL Server
- python-3.x - 在 stderr 中打印的 for 循环之后打印一个字符串
- arrays - VBA使用Like运算符在数组中查找字符串不起作用
- algorithm - 流程图是否有标准的机器可读格式?
- docker - 如何从游牧民族运行 cassandra docker 容器?
- python - Python的继承__init__ this self是哪个self?
- c - sprintf 格式 - 在 u 之前有三个“%%%”,在 n 之前有两个“%%”?
- .net - ASPNet Core - macOS 开发人员找不到 appsettings 和 wwwroot
- database - Laravel 多租户在租户数据库中创建第一个用户
- css - Angular Material:如何将自定义主题排版应用于主题文件之外的 CSS 类?