gpt4 book ai didi

Flutter 对象在 initState 之后没有初始化

转载 作者:IT王子 更新时间:2023-10-29 07:16:27 27 4
gpt4 key购买 nike

我是 Flutter 的新手,遇到了一个问题。

我的应用中有一个 Feed 模型,如下所示:

import 'package:uuid/uuid.dart';

class Feed {

// Static Members
var uuid = new Uuid();

// Members
String id;
bool isScheduled;
DateTime createdTime;
DateTime feedingTime;
String deviceId;

// Constructors
Feed({this.feedingTime, this.deviceId, this.isScheduled}) {
id = uuid.v4();
createdTime = DateTime.now();
}

Feed.fromDevice(deviceId) {
Feed(deviceId: deviceId, feedingTime: DateTime.now(), isScheduled: false);
}
}

现在我有我的 AddFeedForm,我正在尝试使用默认值初始化,在 InitState 中:

class _AddFeedFormState extends State<AddFeedForm> {
// Final Members
final _formKey = GlobalKey<FormState>();
final List<Machine> _devices = machinesFromServer;

// Members
Feed _feed;

@override
void initState() {
_feed = Feed.fromDevice(_devices.first.id);
super.initState();
}

但不知何故在 initState 之后 _feed 参数保持为空!

有什么想法吗?

最佳答案

But somehow after the initState the _feed parameter stays null!

你确定是这种情况吗,而不是你得到一个 Feed具有空字段的实例?

看起来你的命名构造函数不正确:

Feed.fromDevice(deviceId) {
Feed(deviceId: deviceId, feedingTime: DateTime.now(), isScheduled: false);
}

此处您在命名构造函数中调用默认的 Feed 构造函数,但不对结果执行任何操作 - 这是创建另一个 Feed然后把它扔掉。命名构造函数返回的尚未初始化。

您可能想要的是:

Feed.fromDevice(deviceId):
this(deviceId: deviceId, feedingTime: DateTime.now(), isScheduled: false);

这使得 fromDevice构造函数调用默认构造函数来初始化实例,而不是创建另一个未使用的副本。

另一种选择是将其设为静态方法:

static fromDevice(deviceId) {
return Feed(deviceId: deviceId, feedingTime: DateTime.now(), isScheduled: false);
}

在这种情况下不会有太大区别。构造函数看起来更好,但有时你可能会发现你想要 a) 使初始化异步(静态方法可以返回 Future<Feed> 但构造函数不能或 b)做更多在将参数传递给可能不适合初始化程序调用的实际构造函数之前对参数进行处理。

关于Flutter 对象在 initState 之后没有初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com