我想添加一个可选的功能到我的小部件:
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
在它的签名。