在initState之后未初始化Flutter对象

时间:2019-07-27 15:50:32

标签: flutter dart

我是新手,我遇到了麻烦。

我的应用程序中有一个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参数仍然为空!

有什么想法吗?

1 个答案:

答案 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)在将参数传递给可能不太适合初始化程序调用的真实构造函数之前,需要对其进行更多处理。