参数类型'List<Contact>?'不能分配给参数类型"列表<多选项<dynamic>>



我正在尝试测试fluft_contacts库。我愿意建立一个视图,用户可以选择几个联系人,并在选择时将每个联系人显示在芯片中。我的问题是我有列表联系人。但是对于多选,我必须提供List<多选项>。请,你知道我是否可以将我的列表联系人转换为列表<多选项>。

非常感谢。

import 'package:flutter/material.dart';
import 'package:flutter_contacts/flutter_contacts.dart';
import 'package:multi_select_flutter/bottom_sheet/multi_select_bottom_sheet_field.dart';
import 'package:multi_select_flutter/chip_display/multi_select_chip_display.dart';
void TEST() => runApp(const FlutterContactsExample());
final _multiSelectKeyContext = GlobalKey<FormFieldState>();
class FlutterContactsExample extends StatefulWidget {
const FlutterContactsExample({Key? key}) : super(key: key);
@override
State<FlutterContactsExample>  createState() => _FlutterContactsExampleState();
}
class _FlutterContactsExampleState extends State<FlutterContactsExample> {
List<Contact>? _contacts;
bool _permissionDenied = false;
late List<bool> isChecked;
@override
void initState() {
super.initState();
_fetchContacts();
}
Future _fetchContacts() async {
if (!await FlutterContacts.requestPermission(readonly: true)) {
setState(() => _permissionDenied = true);
} else {
final contacts = await FlutterContacts.getContacts();
setState(() => _contacts = contacts);
}
}
@override
Widget build(BuildContext context) => MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('flutter_contacts_example')),
body: Column(
children: [
_body(),
///MultiSelect for Context
MultiSelectBottomSheetField(
key: _multiSelectKeyContext,
initialChildSize: 0.7,
maxChildSize: 0.95,
title: const Text("Context", style: TextStyle(fontSize: 19),),
buttonText: const Text(
"Context", style: TextStyle(fontSize: 19),),
searchTextStyle: const TextStyle(fontSize: 19),
searchHintStyle: const TextStyle(fontSize: 19),
itemsTextStyle: const TextStyle(fontSize: 19),
items: _contacts,
searchable: true,
onConfirm: (valueContext) {
setState(() {
_contextSelected = valueContext;
print('mon test ligne 152');
print(_contextSelected);
});
_multiSelectKeyContext.currentState!.validate();
},
chipDisplay: MultiSelectChipDisplay(
textStyle: const TextStyle(color: Colors.white, fontWeight: FontWeight.bold,fontSize: 19),
onTap: (dynamic item) {
setState(() {
});
_multiSelectKeyContext.currentState!.validate();
},
),
),
const SizedBox(height: 40),
],
)));
Widget _body() {
if (_permissionDenied) return const Center(child: Text('Permission denied'));
if (_contacts == null) return const Center(child: CircularProgressIndicator());
return ListView.builder(
itemCount: _contacts!.length,
itemBuilder: (context, i) => ListTile(
title: (Text(_contacts![i].displayName)),

onTap: () async {
final fullContact =
await FlutterContacts.getContact(_contacts![i].id);
await Navigator.of(context).push(
MaterialPageRoute(builder: (_) => ContactPage(fullContact!)));
}
)
);
}
}
class ContactPage extends StatelessWidget {
final Contact contact;
const ContactPage(this.contact, {Key? key}) : super(key: key);
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(title: Text(contact.displayName)),
body: Column(children: [
Text('First name: ${contact.name.first}'),
Text('Last name: ${contact.name.last}'),
Text(
'Phone number: ${contact.phones.isNotEmpty ? contact.phones.first.number : '(none)'}'),
Text(
'Email address: ${contact.emails.isNotEmpty ? contact.emails.first.address : '(none)'}'),
]));
}

MultiSelectBottomSheetField而不是中

items: _contacts,

你应该这样写:

items: _contacts.map((e) => MultiSelectItem(e, e.name)).toList(),

如下所示:链接到示例。

因为正如你得到的错误和文档都说的那样,这里需要List<MultiSelectItem<V>>,而你给了它List<Contact>?

最新更新