因为我当前没有可用的模拟数据,所以我创建了自己的模拟数据,并且目前正在努力获取特定值。
这个想法是拥有一个我已经实例化的设备列表,从中我获取数据并将其显示在 ListView 中。这已经可以工作了,但我没有找到如何迭代此列表以获取设备 1 的名称、设备 2 的名称等的解决方案。
当前我得到一个返回 2 个元素的 ListView,但它仅返回值“一” - 因此程序不会迭代列表。因为另一个元素的名字是“二”。
这是当前状态的屏幕截图: 在此输入图片描述
有人知道如何解决吗?
我的代码:
创建特定设备的设备类:
import 'package:flutter/material.dart';
class Device {
Device({this.name,});
String? name;
}
Mock-API 创建设备列表并返回其名称:
import 'package:myProject/stack/device.dart';
import 'package:flutter/material.dart';
class ApiDummyData {
static List<Device> devicesList = [Device(name: "one"), Device(name: "two")];
int counter = -1;
dynamic getDeviceName() {
counter++;
return devicesList.elementAt(counter).name;
}
}
我自己创建的ListViewElement:
import 'package:myProject/api/api_dummy_data.dart';
import 'package:myProject/stack/device.dart';
import 'package:flutter/material.dart';
class MyListViewElement extends StatelessWidget {
MyListViewElement({
super.key,
});
final getDeviceNameInstance = ApiDummyData();
@override
Widget build(BuildContext context) {
return Container(
decoration: **...**,
child: Padding(
**...**,
child: Row(
children: [
Icon(
**...**
),
**Text(getDeviceNameInstance.getDeviceName(),**
style: TextStyle(color: Colors.white, fontSize: 25))
],
),
));
}
}
在特定视图中使用数据:
class DeviceView extends StatelessWidget {
const DeviceView({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: [
for (int i = 0; i < ApiDummyData.devicesList.length; i++)
buildChild(i)
],
),
);
}
buildChild(int i) {
return InkWell(
onTap: () {
print("success");
},
child: MyListViewElement()),
);
}
我已经尝试实现计数器或 for 循环,但没有解决问题。 :( 我还尝试使用视图文件中的 i 计数器将其放入子项中:MyListViewElement(i)),但是发生了很多错误..
那是因为每次你创建一个
MyListViewElement
它都会创建自己的ApiDummyData()对象,所以每次你创建一个对象计数器都会是0。
因此您只能看到第一个设备的名称。
因此,要解决这个问题,您有两种选择。
使计数器静态
这使得所有实例化的对象共享相同的值,并且第
N
号对象的计数器将等于 N-1
。
但是这是一个快速的解决方案,但仍然不专业。
将
传递给counter
ApiDummyData
并确保返回该计数器对应的设备名称!明白了。
class ApiDummyData {
static List<Device> devicesList = [Device(name: "one"), Device(name: "two")];
int counter;
ApiDummyData({required this.counter})
dynamic getDeviceName() {
counter++;
return devicesList.elementAt(counter).name;
}
}
顺便说一句,由于您提供了一个代码模拟(不是真实的),我们无法提供更多帮助,因为数据层例如:
ApiDummyData
应该将该列表发送到其他层来管理其表示(我的意思是,您不应多次调用数据层来获取设备名称,只需捕获该列表并自己管理即可)。