Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查询ListView中每个项目的SharedReference_Listview_Dart_Flutter_Sharedpreferences - Fatal编程技术网

查询ListView中每个项目的SharedReference

查询ListView中每个项目的SharedReference,listview,dart,flutter,sharedpreferences,Listview,Dart,Flutter,Sharedpreferences,我有一个联系人列表,我正试图使用插件将其加载到ListView中。对于每个联系人,我想首先检查他们是否被标记为isfavorite,通过检查他们的ID是否在SharedReferences中的列表中来确定。如果是这样,那么我们在他们的名字旁边显示一颗星星 因为检查SharedReferences需要一个未来,我如何实现这一点?迄今为止的进展如下 联系人屏幕: @override Widget build(BuildContext context) { return Scaffold(

我有一个联系人列表,我正试图使用插件将其加载到ListView中。对于每个联系人,我想首先检查他们是否被标记为
isfavorite
,通过检查他们的ID是否在
SharedReferences
中的列表中来确定。如果是这样,那么我们在他们的名字旁边显示一颗星星

因为检查SharedReferences需要一个未来,我如何实现这一点?迄今为止的进展如下

联系人屏幕:

@override
Widget build(BuildContext context) {
    return Scaffold(
    body: ListView.builder(
                itemCount: contacts?.length,
                itemBuilder: (BuildContext context, int index) {
                Contact c = contacts?.elementAt(index);

                return ListTile(
                    // Show star next to Contact's name
                    leading: c.isFavourite ? Icon(Icons.star) : null,
                    title: Text(c.name);
                );
            }
        );
    );
}
共享首选项:

static Future<bool> checkIsFavourite(String contactId) async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    List<String> favouriteContacts = prefs.getStringList("Favourites");
    return favouriteContacts.contains(contactId);
}
static Future checkisfavorite(字符串contactId)异步{
SharedReferences prefs=等待SharedReferences.getInstance();
List FavoriteContacts=prefs.getStringList(“收藏夹”);
返回FavoriteContacts.contains(contactId);
}
联络服务:

class ContactsService {
static const MethodChannel _channel =
    MethodChannel('github.com/clovisnicolas/flutter_contacts');

/// Fetches all contacts, or when specified, the contacts with a name
/// matching [query]
static Future<Iterable<Contact>> getContacts(
    {String query, bool withThumbnails = true}) async {
    Iterable contacts = await _channel.invokeMethod('getContacts',
        <String, dynamic>{'query': query, 'withThumbnails': withThumbnails});

    return contacts.map((m) => Contact.fromMap(m));
}
class contacts服务{
静态常量方法通道u通道=
MethodChannel('github.com/clovisnicolas/flatter_contacts');
///获取所有联系人,或在指定时获取具有名称的联系人
///匹配[查询]
静态未来联系人(
{字符串查询,bool with thumbnails=true})异步{
Iterable contacts=wait_channel.invokeMethod('getContacts',
{'query':查询'withThumbnails':withThumbnails});
返回contacts.map((m)=>Contact.fromMap(m));
}
联络类别:

class Contact {
    Contact(
        {this.givenName,
        this.middleName,
        this.prefix,
        this.suffix,
        this.familyName,
        this.company,
        this.jobTitle,
        this.emails,
        this.phones,
        this.postalAddresses,
        this.avatar,
        this.note,
        this.isSelected});

    String identifier,
        displayName,
        givenName,
        middleName,
        prefix,
        suffix,
        familyName,
        company,
        jobTitle,
        note;
    Iterable<Item> emails = [];
    Iterable<Item> phones = [];
    Iterable<PostalAddress> postalAddresses = [];
    Uint8List avatar;
    bool isSelected;

    String initials() {
        return ((this.givenName?.isNotEmpty == true ? this.givenName[0] : "") +
                (this.familyName?.isNotEmpty == true ? this.familyName[0] : ""))
            .toUpperCase();
    }

    Contact.fromMap(Map m) {
        identifier = m["identifier"];
        displayName = m["displayName"];
        givenName = m["givenName"];
        middleName = m["middleName"];
        familyName = m["familyName"];
        prefix = m["prefix"];
        suffix = m["suffix"];
        company = m["company"];
        jobTitle = m["jobTitle"];
        emails = (m["emails"] as Iterable)?.map((m) => Item.fromMap(m));
        phones = (m["phones"] as Iterable)?.map((m) => Item.fromMap(m));
        postalAddresses = (m["postalAddresses"] as Iterable)
            ?.map((m) => PostalAddress.fromMap(m));
        avatar = m["avatar"];
        note = m["note"];
        isSelected = SharedPreferences.checkIsFavourite(m["identifier"]); 
        // What is the correct way to check if it's a favourite?
    }
class联系人{
接触(
{这是吉文纳姆,
这个名字,
这个前缀,
这个后缀,
这是我的家庭名字,
这家公司,
这个职位,
这是电子邮件,
这是电话,
这件衣服,
这个,阿凡达,
注意,
这是});
字符串标识符,
显示名称,
吉文纳姆,
middleName,
前缀
后缀
家庭名称,
公司,
职务,
注;
Iterable电子邮件=[];
Iterable电话=[];
Iterable Postaladdens=[];
UINT8列表化身;
布尔当选;
字符串首字母(){
return((this.givenName?.isNotEmpty==true?this.givenName[0]:“”)+
(this.familyName?.isNotEmpty==true?this.familyName[0]:“”)
.toUpperCase();
}
联系人:fromMap(地图m){
标识符=m[“标识符”];
displayName=m[“displayName”];
givenName=m[“givenName”];
middleName=m[“middleName”];
familyName=m[“familyName”];
前缀=m[“前缀”];
后缀=m[“后缀”];
公司=m[“公司”];
jobTitle=m[“jobTitle”];
emails=(m[“emails”]作为Iterable)?.map((m)=>Item.fromMap(m));
phones=(m[“phones”]作为Iterable)?.map((m)=>Item.fromMap(m));
postalAddresses=(m[“postalAddresses”]作为Iterable)
?.map((m)=>PostalAddress.fromMap(m));
化身=m[“化身”];
注=m[“注”];
isSelected=SharedReferences.CheckIsFavorite(m[“标识符”]);
//什么是正确的方法来检查它是否是最受欢迎的?
}

我建议定义一个在应用程序启动时初始化的应用程序范围的超级变量

e、 g.main.dart

SharedReferences优先权;
void main()异步{
prefs=等待SharedReferences.getInstance();
返回runApp(MyApp());
}
然后,您可以将
prefs
变量以构造函数参数的形式传递给任何其他屏幕/小部件

class ContactsScreen扩展StatefulWidget{
接触屏幕({
关键点,
@需要此.prefs,
}):
超级(键:键);
最终共享参考优先权;
...
}
您可能在代码中注意到,每次在
列表视图中构建联系人时,都会调用
SharedReferences
初始化,然后是
prefs.getStringList(“收藏夹”)
调用

如果您定义一次Favorites数组并将其用于每个contact build调用,则可以避免这两个相对繁重的操作

我要做的是在
Contact
对象中创建
isfavorite
函数,该函数接受
List
作为参数

class联系人{
...
bool isfavorite(列出收藏夹ID){
断言(FavoriteId!=null);
返回FavoriteId.contains(this.identifier);
}
...
}
并在联系人屏幕中
生成

final List favoriteId=prefs.getStringList(“收藏夹”)??[];//如果未设置“收藏夹”,请使用空数组
...
列表砖(
//在联系人姓名旁边显示星号
前导:contact.isFavorite(FavoriteId)?图标(Icons.star):空,
标题:文本(联系人姓名);
);
...

但是,我必须警告您,我不知道全局(/super/app-wide)变量在Dart/Flutter中是如何处理的,也不知道将
main()
方法声明为
async
是否是一个好主意,因此使用它的风险由您自己承担。(更新)

根据我个人的经验,到目前为止,我还没有遇到任何问题

已更新

结果是将
main()
声明为
async
if


至于全局变量-尽管存在一个。

我建议定义一个在应用程序启动时初始化的应用程序范围的超级变量,但我的方法仍然可以

e、 g.main.dart

SharedReferences优先权;
void main()异步{
prefs=等待SharedReferences.getInstance();
返回runApp(MyApp());
}
然后,您可以将
prefs
变量以构造函数参数的形式传递给任何其他屏幕/小部件

class ContactsScreen扩展StatefulWidget{
接触屏幕({
关键点,
@需要此.prefs,
}):
超级(键:键);
最终共享参考优先权;
...
}
您可能已经注意到,在代码中,每当在
ListView
中构建联系人时,都会调用
SharedReferences
初始化,后跟
prefs.getStringList(“Favou”)