错误:应使用类型为"((列表<dynamic>)=> void)?"的值,但得到类型为 '(List<String>) => void' 的值之一



我想添加一个可选的功能到我的小部件:

final void Function(List<TList>)? onConfirm;

得到这个错误:

"错误:期望的值类型为'((List) =>void) ?’,但我得到了type '(List) =>无效的

在我的小部件的指定行:

import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:multi_select_flutter/chip_display/multi_select_chip_display.dart';
import 'package:multi_select_flutter/util/multi_select_item.dart';
import 'package:new_day_flutter/generated/l10n.dart';
import 'package:new_day_flutter/presentation/common/widgets/form_fields/multiselect_dialog/fb_multiselect_dialog_field.dart';
import 'package:new_day_flutter/presentation/theme/palette.dart';
class BlMultiselectField<TList> extends StatefulWidget {
const BlMultiselectField({
Key? key,
required this.name,
required this.options,
required this.labelText,
this.onConfirm,
this.hasFocus = false,
this.initialValue = const [],
this.dialogHeight,
this.globalKey,
this.onFocusChange,
}) : super(key: key);
final GlobalKey<FormFieldState>? globalKey;
final List<MultiSelectItem<TList>> options;
final List<TList> initialValue;
final double? dialogHeight;
final String name;
final void Function(bool)? onFocusChange;
final bool hasFocus;
final String labelText;
final void Function(List<TList>)? onConfirm;
@override
_BlMultiselectFieldState createState() => _BlMultiselectFieldState();
}
class _BlMultiselectFieldState<TList> extends State<BlMultiselectField<TList>> {
@override
Widget build(BuildContext context) {
return FocusScope(
child: FocusScope(
child: Focus(
onFocusChange: (isFocused) {
if (widget.onFocusChange != null) {
widget.onFocusChange!(isFocused);
}
},
child: FormBuilderField<List<TList>>(
name: widget.name,
initialValue: widget.initialValue,
builder: (FormFieldState<List<TList>> field) {
String labelText = (field.value ?? []).isNotEmpty
? S.of(context).selectedCount(field.value!.length)
: widget.labelText;
return BlMultiSelectDialogField<TList>(
key: GlobalKey(),
chipDisplay: MultiSelectChipDisplay.none(),
searchable: true,
initialValue: widget.initialValue,
items: widget.options,
selectedValues: field.value ?? [],
title: Text(widget.labelText),
selectedColor: bluelabBlue,
dialogHeight: widget.dialogHeight,
decoration: const BoxDecoration(
border: Border(
bottom: BorderSide(color: bluelabBlue),
),
),
labelText: Text(
labelText,
style: const TextStyle(color: bluelabBlue),
),
labelIcon: const Icon(
Icons.arrow_drop_down,
color: bluelabBlue,
size: 24,
),
onConfirm: (value) {
widget.onConfirm?.call(value); //************* HERE *********
field.didChange(value);
},
onCancel: (context, value) {
setState(() {

});
Navigator.pop(context);
},
);
}))));
}
}

像这样使用小部件:

BlMultiselectField<String>(
globalKey: _filterDeviceGlobalKey,
labelText: S.of(context).selectDevice,
onConfirm: (x) {
setState(() {});
},
name: 'devices',
initialValue:
widget.selectedDeviceIdentifiers.map((e) => e.key).toList(),
options: devices
.map((e) => MultiSelectItem<String>(e.key, e.value))
.toList(),
dialogHeight: 200,
)

当我将其更改为

时,它可以工作:final void Function(List<dynamic>)? onConfirm;

不知道为什么不处理泛型。

我认为你应该这样做:

final void Function(List<TList>?) onConfirm;

This

_BlMultiselectFieldState createState() => _BlMultiselectFieldState();

应该是:

_BlMultiselectFieldState<TList> createState() => _BlMultiselectFieldState<TList>();

否则,状态类的TList将始终是dynamic,而不匹配小部件的TList类型。这是一个问题,当你使用一个函数有TList在它的签名。

相关内容

最新更新