我是新手,我遇到了麻烦。
我的应用程序中有一个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);
}
}
现在我要在InitState中使用默认值初始化我的AddFeedForm:
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参数仍然为空!
有什么想法吗?
答案 0 :(得分:1)
但是在initState之后,_feed参数仍然为空!
您确定是这种情况,而不是得到具有空字段的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)在将参数传递给可能不太适合初始化程序调用的真实构造函数之前,需要对其进行更多处理。