flutter Fluuter,如何解决“预期值类型为”List〈DropdownMenuItem< Object>>?“,但获得的值类型为”List< dynamic>“

yrdbyhpb  于 2023-03-04  发布在  Flutter
关注(0)|答案(2)|浏览(140)

我正在将记录列表传递给自定义下拉列表,但出现标题错误。
//dataList是一个包含2个字段的记录列表:整型ID和字符串名称

Widget DropDownList(dataList, val, ReturnSelectedValue) {
  return DropdownButton(
    value: val,
    isExpanded: true,
    items: dataList.map((item) {
      return DropdownMenuItem(
        value: item.id,
        child: Text(item.name!),
      );
    }).toList(),
    onChanged: (selectedvalue) {
      ReturnSelectedValue(selectedvalue);
    },
  );
}
omhiaaxx

omhiaaxx1#

您可以使用type inference来确保dataList是正确的类型,方法是使用List<DropdownMenuItem<T>>. from构造函数。

Widget DropDownList(dataList, val, ReturnSelectedValue) {
  return DropdownButton(
    value: val,
    isExpanded: true,
    items: List<DropdownMenuItem<Object>>.from(dataList.map((item) {
      return DropdownMenuItem(
        value: item.id,
        child: Text(item.name!),
      );
    })),
    onChanged: (selectedvalue) {
      ReturnSelectedValue(selectedvalue);
    },
  );
}
1wnzp6jl

1wnzp6jl2#

下面是完整的例子:

    • 代码:**
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter App',
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String selectedValue = '1';

  List<Data> dataList = [
    Data(id: '1', name: 'January'),
    Data(id: '2', name: 'February'),
    Data(id: '3', name: 'March'),
    Data(id: '4', name: 'April'),
    Data(id: '5', name: 'May'),
    Data(id: '6', name: 'June'),
    Data(id: '7', name: 'July'),
    Data(id: '8', name: 'August'),
    Data(id: '9', name: 'September'),
    Data(id: '10', name: 'October'),
    Data(id: '11', name: 'November'),
    Data(id: '12', name: 'December'),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Flutter Moment Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            DropDownList(
              dataList: dataList,
              val: selectedValue,
              returnSelectedValue: (String) {
                setState(() {
                  selectedValue = String;
                });
                print('Selected value: $String');
              },
            ),
            Text(dataList.where((element) => element.id == selectedValue).first.name)
          ],
        ),
      ),
    );
  }
}

class Data {
  final String id;
  final String name;

  Data({required this.id, required this.name});
}

class DropDownList extends StatelessWidget {
  final List<Data> dataList;
  final String val;
  final Function(String) returnSelectedValue;

  const DropDownList({
    super.key,
    required this.dataList,
    required this.val,
    required this.returnSelectedValue,
  });

  @override
  Widget build(BuildContext context) {
    return DropdownButton(
      value: val,
      isExpanded: true,
      items: dataList.map((item) {
        return DropdownMenuItem(
          value: item.id,
          child: Text(item.name),
        );
      }).toList(),
      onChanged: (selectedValue) {
        returnSelectedValue.call(selectedValue!);
      },
    );
  }
}

相关问题