NoSuchMethodError: getter 'dlongitude' 在 null 上被调用

时间:2021-04-24 05:27:01

标签: flutter dart

我是 Flutter 的新手。我试图创建一个公共类并从其他类访问它的变量。我的应用中有这个类:

class Target {
  double dlatitude;
  double dlongitude;
  Target({this.dlatitude, this.dlongitude});
}

我在其他有状态小部件中使用这个类来设置其变量的值:

class _EditLocationState extends State<EditLocation> {
  final TextEditingController _search = TextEditingController();

  Target target = Target();

  @override
  void dispose() {
    _search.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          Positioned(
            left: 20,
            top: 50,
            right: 20,
            child: TextField(
              controller: _search,
              decoration: InputDecoration(
                filled: true,
                fillColor: Colors.grey[400],
                hintText: "${widget.location}",
                ),
              ),
            ),
            
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          var array = _search.text.split(",");
            Target(
                dlongitude: double.parse(array[0]),
                dlatitude: double.parse(array[1]));
          }
          print(target.dlatitude); // null value is printed here.
        },
        child: const Icon(Icons.done),
        backgroundColor: Colors.green,
      ),
    );
  }
}

每当我尝试访问其他小部件中的 Target 变量值时,我都会收到此错误:NoSuchMethodError: The getter 'dlongitude' was called on null.

class _SearchRideState extends State<SearchRide> {
  final TextEditingController _search = TextEditingController();

  Target target=Target();

  @override
  void dispose() {
    _search.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          Positioned(
            left: 20,
            top: 50,
            right: 20,
            child: TextField(
              controller: _search,
              decoration: InputDecoration(
                filled: true,
                fillColor: Colors.grey[400],
                hintText: "${target.dlatitude},${target.dlongitude}"
              ),
            ),
          ),
        ],
      ),
    );
  }
}

我该怎么办?

2 个答案:

答案 0 :(得分:3)

首先,你必须引用classtour

现在来回答您的问题,如果您正在与班级一起工作并想要分配值,则可以这样完成:

Target target = Target(dlatitude: 1.1, dlongitude: 2.0);

你刚刚做了 Target target = Target(); 这就是为什么创建了空对象并且你在那里得到了一个空值。而下面的代码意义不大。

onPressed: () {
  var array = _search.text.split(",");
  Target(
    dlongitude: double.parse(array[0]),
    dlatitude: double.parse(array[1]),
  );
  print(target.dlatitude);
}

1.这就是为什么您的代码的解决方案如下: 删除Target target = Target();

onPressed: () {
  var array = _search.text.split(",");
  Target target = Target(
    dlongitude: double.parse(array[0]),
    dlatitude: double.parse(array[1]),
  );
  print(target.dlatitude);
}

2.或者你可以在类中提供一个默认值:

class Target {
  double dlatitude;
  double dlongitude;
  Target({this.dlatitude=0.0, this.dlongitude=0.0});
}

然后在你的逻辑中,它会是这样的:

Target target = Target(); 代码保持原样。还有

onPressed: () {
  var array = _search.text.split(",");
  target.dlongitud = double.parse(array[0]);
  target.dlongitude = double.parse(array[1]);
  print(target.dlatitude);
}

答案 1 :(得分:1)

您正在使用可选参数,这意味着如果它们没有像您在示例中那样传递给构造函数:

Target target=Target();

其属性的默认值为 null,因此是 'error: NoSuchMethodError: The getter 'dlongitude' '。

你可以做两件事:

  1. 实际上为属性赋值为 var target=Target(dlatitude:0.0, dlongitude:4.5);

2.或者为属性定义一个默认值,使它们永远不会为空

class Target {
  double dlatitude;
  double dlongitude;
  Target({this.dlatitude=0.0, this.dlongitude=0.0});
}

我建议您使用 tour 语言,它写得非常好。