flutter - 如何在运行时仅实例化一次列表(颤振)?
问题描述
我写了一个可以添加对象的页面。现在我也希望能够删除对象。但是,如果在我切换到另一个页面(在我的底部导航栏中)并返回后尝试删除一个对象,我总是会收到错误消息。错误:setState() called after dispose(): _DevicesPageHeroState#09bb8(lifecycle state: defunct, not mounted)
。
这可能是因为如果我重新加载DevicesPageHero
. 我认为static
可能会解决它,但看起来它没有。
class _DevicesPageHeroState extends State<DevicesPageHero> {
List<String> newMatrixNames = ['Default'];
static List<Matrix> matrixList = [
Matrix(
heroTag: 'm1',
name: 'Matrix Kitchen',
matrixIMG: 'imgs/matrix1.png',
size: 10),
];
static List<Widget> matrixCall = [
MatrixPageOne(
matrix: matrixList[0],
)
];
matrixCall 列表用于告诉以后应该加载哪个页面。我添加了一个这样的列表元素:
void addMatrix(String name, int size) {
final Matrix newMat = Matrix(
name: name,
matrixIMG: 'imgs/matrix4.png',
size: size,
heroTag: DateTime.now().toString());
setState(() {
matrixList.add(newMat);
matrixCall.add(MatrixPageOne(
matrix: newMat,
delm: deleteMatrix,
));
print("matrixList");
print(matrixList);
});
}
并像这样删除它:
void deleteMatrix(Matrix matrix) {
setState(() {
matrixCall.removeAt(matrixList.indexOf(matrix));
matrixList.remove(matrix);
print(matrixList.length);
});
}
如果您有任何想法,我只能在第一次加载时实例化我的矩阵列表,DevicesPageHero
我会非常高兴。抱歉,如果我刚从编码开始做一些过于复杂的事情。
解决方案
确保在 setState 方法发生之前检查挂载状态:
@override
void setState(fn) {
if (mounted) {
super.setState(fn);
}
}
该片段将帮助您解决您遇到的错误。
推荐阅读
- javascript - cors 中间件与发送标头相同吗?
- urbancode - 使用 IBM UCD 将 Git 目录结构复制到本地
- php - Nginx 不会在 WSL 上执行 php 文件。我怎样才能解决这个问题?
- php - 如何在 PHP IIS 中添加 ZeroMQ 扩展
- c# - 让 C# 为已解析的 ISO 8601 字符串正确设置 Kind 属性
- haskell - 在命令行中运行时输出 putStrLn 抛出错误
- python - Pytest 测试用例失败,但从具有相同输入的终端运行时给出正确结果
- mips - 在 MIPS 汇编语言中使用 syscall 30
- java - 图形(java.awt.Graphics)不能在通话中工作
- json - 如何通过 jq 合并来自多个文件的 JSON 数组并保留顺序