从所有列表元素返回值

问题描述 投票:0回答:1

因为我当前没有可用的模拟数据,所以我创建了自己的模拟数据,并且目前正在努力获取特定值。

这个想法是拥有一个我已经实例化的设备列表,从中我获取数据并将其显示在 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)),但是发生了很多错误..

flutter list listview
1个回答
0
投票

那是因为每次你创建一个

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
应该将该列表发送到其他层来管理其表示(我的意思是,您不应多次调用数据层来获取设备名称,只需捕获该列表并自己管理即可)。

© www.soinside.com 2019 - 2024. All rights reserved.