我是 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}"
),
),
),
],
),
);
}
}
我该怎么办?
答案 0 :(得分:3)
现在来回答您的问题,如果您正在与班级一起工作并想要分配值,则可以这样完成:
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' '。
你可以做两件事:
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 语言,它写得非常好。