首页 > 解决方案 > 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' 是文件夹的标题。

标签: listflutterdart

解决方案


你能试试这个吗?

 Folder({
    this.title = '',
    this.folderContent = const [],
  });

  String title;
  List<Block> folderContent;
  String id;

通常在调用构造函数时检查不需要函数的变量的赋值,可以直接通过构造函数进行。如果您稍后需要使用addor 修改列表,请检查列表是否为空,如果是,则不要使用adduse =


推荐阅读