Flutter Flitter中最喜欢的按钮在重新启动应用程序中不受欢迎

Flutter Flitter中最喜欢的按钮在重新启动应用程序中不受欢迎,flutter,dart,Flutter,Dart,我有一个带有收藏夹图标的ListView项目,我想添加功能,以便将列表添加到收藏夹列表中。数据已成功添加到收藏夹列表。 这里是主页 body: ListView.builder( itemCount: 100, cacheExtent: 20.0, padding: const EdgeInsets.symmetric(vertical: 16), itemBuilder: (context, index) => ItemTi

我有一个带有收藏夹图标的ListView项目,我想添加功能,以便将列表添加到收藏夹列表中。数据已成功添加到收藏夹列表。 这里是主页

body: ListView.builder(
        itemCount: 100,
        cacheExtent: 20.0,
        padding: const EdgeInsets.symmetric(vertical: 16),
        itemBuilder: (context, index) => ItemTile(index),
      ),
还有我用过的ListTile类

var favoritesList = Provider.of<Favorites>(context);

child: ListTile(
        leading: CircleAvatar(
          backgroundColor: Colors.primaries[index % Colors.primaries.length],
        ),
        title: Text(
          'Item $index',
          key: Key('text_$index'),
        ),
        trailing: IconButton(
          key: Key('icon_$index'),
          icon: favoritesList.items.contains(index)
              ? Icon(Icons.favorite, color: Colors.redAccent)
              : Icon(Icons.favorite_border),
          onPressed: () {
            !favoritesList.items.contains(index)
                ? favoritesList.add(index)
                : favoritesList.remove(index);
            Scaffold.of(context).showSnackBar(
              SnackBar(
                content: Text(favoritesList.items.contains(index)
                    ? 'Added to favorites.'
                    : 'Removed from favorites.'),
                duration: Duration(seconds: 1),
              ),
            );
          },
        ),
      ),
var-favoritesList=Provider.of(上下文);
孩子:ListTile(
领先:CircleAvatar(
背景色:Colors.primaries[索引%Colors.primaries.length],
),
标题:正文(
“项目$index”,
key:key('text_$index'),
),
尾随:图标按钮(
key:key('icon_$index'),
图标:favoritesList.items.contains(索引)
?图标(图标。收藏夹,颜色:颜色。红色重音)
:图标(图标。收藏夹边框),
已按下:(){
!favoritesList.items.contains(索引)
?收藏夹列表添加(索引)
:收藏夹列表。删除(索引);
Scaffold.of(上下文).showSnackBar(
小吃条(
内容:文本(favoritesList.items.contains(索引)
?“已添加到收藏夹。”
:“已从收藏夹中删除。”),
持续时间:持续时间(秒数:1),
),
);
},
),
),
我有一个模特班的最爱

class Favorites extends ChangeNotifier {
  final List<int> _favoriteItems = [];
  List<int> get items => _favoriteItems;
  void add(int itemNo) {
    _favoriteItems.add(itemNo);
    notifyListeners();
  }
  void remove(int itemNo) {
    _favoriteItems.remove(itemNo);
    notifyListeners();
  }
}
类收藏夹扩展了ChangeNotifier{
最终列表_favoriteItems=[];
列表获取项目=>\u收藏夹项目;
无效添加(int itemNo){
_favoriteItems.add(itemNo);
notifyListeners();
}
无效删除(int itemNo){
_favoriteItems.remove(itemNo);
notifyListeners();
}
}
在我最喜欢的页面。我正在完善一切,也可以删除喜爱的项目,但当我重新打开我的应用程序时,我没有得到任何喜爱的项目

这是我的个人主页

body: Consumer<Favorites>(
        builder: (context, value, child) => ListView.builder(
          itemCount: value.items.length,
          padding: const EdgeInsets.symmetric(vertical: 16),
          itemBuilder: (context, index) => FavoriteItemTile(value.items[index]),
        ),
      ),
主体:消费者(
生成器:(上下文、值、子项)=>ListView.builder(
itemCount:value.items.length,
填充:常量边集。对称(垂直:16),
itemBuilder:(上下文,索引)=>FavoriteItemTile(value.items[index]),
),
),
收藏夹项目磁砖

child: ListTile(
        leading: CircleAvatar(
          backgroundColor: Colors.primaries[itemNo % Colors.primaries.length],
        ),
        title: Text(
          'Item $itemNo',
          key: Key('favorites_text_$itemNo'),
        ),
        trailing: IconButton(
          key: Key('remove_icon_$itemNo'),
          icon: Icon(Icons.close),
          onPressed: () {
            Provider.of<Favorites>(context, listen: false).remove(itemNo);
            Scaffold.of(context).showSnackBar(
              SnackBar(
                content: Text('Removed from favorites.'),
                duration: Duration(seconds: 1),
              ),
            );
          },
        ),
      ),
child:ListTile(
领先:CircleAvatar(
backgroundColor:Color.primaries[itemNo%Color.primaries.length],
),
标题:正文(
'项目$itemNo',
key:key('favorites\u text\u$itemNo'),
),
尾随:图标按钮(
key:key('remove_icon_u$itemNo'),
图标:图标(Icons.close),
已按下:(){
Provider.of(context,listen:false)。remove(itemNo);
Scaffold.of(上下文).showSnackBar(
小吃条(
内容:文本(“从收藏夹中删除”),
持续时间:持续时间(秒数:1),
),
);
},
),
),

请提供解决方案,我可以与提供商一起使用共享首选项。

一个选项是,您可以根据共享首选项中的索引值进行存储,并查询该索引值,以查看是否将其添加为收藏夹。但是,随着收藏夹数量的增加,它将不再有效,尽管它仍然是一个选项。

如果您想在设备上存储us
文件(pathToFile)。写入(dataAsString)
您可能希望使用
jsonEncode(listofNumber)
将数据保存为json,并使用
jsonDecode()

说明: 要保存数据,请将其转换为json并保存到设备上的文件

//注意:dataAsMap应该是存储要保存的数据的类映射的实例
Directory localDirectory=等待getApplicationDocumentsDirectory();
文件(localDirectory.path+“/”+“fileName.json”).writeastringsync(jsonEncode(dataAsMap));
要获取数据,请执行以下操作:

Map jsonData=jsonDecode(文件(localDirectory.path+“/”+“fileName.json”).readAsStringSync())

是。您应该使用SharedReferences。添加首选项库和这些代码 对象.省道

class Object1{
  bool isLiked;
  String name;
  const Object1(this.name,this.isLiked);//Whatever fields you need
  factory User.fromJson(Map<String, dynamic> parsedJson) {
        return new Object1(
            name: parsedJson['name'] ?? "",
            isLiked: parsedJson['isLiked'] ?? "");
      }

      Map<String, dynamic> toJson() {
        return {
          "name": this.name,
          "isLiked": this.isLiked
        };
      }
}
void main(){

    setData();
    runApp(MyApp);

}
void setData() async{
 SharedPreferences prefs = await SharedPreferences.getInstance();
 List dataList = [Object1("Name",false).toJson()];//Your items in this format
 if prefs.getStringList("lists") == null:
    Map decode_options = jsonDecode(dataList);
    prefs.setStringList(jsonEncode(Object1.fromJson(decode_options)));
}
现在,我们将在可以过滤的地方获取所有数据,而不是为收藏夹创建自定义类

SharedPreferences prefs = await SharedPreferences.getInstance();
Map objectMap = jsonDecode(await shared_User.getStringList('list'));
List itemList = [];
for (item in objectMap):
   itemList.append(User.fromJson(item));
现在,您可以将此项目列表与属性和isLiked功能一起使用,isLiked功能是一个布尔值,用于检查它是否显示。

这可能看起来很复杂,但非常简单,但如果您使用firebase之类的数据库,并在重新启动状态重置时将其存储为文档,您的工作会轻松得多。可以将本地数据存储在设备中或数据库中。我想将其保存在设备中。在我的示例中,如何使用此代码,意味着在哪里。不能添加它吗在我的代码中。你能给我提供完整的例子吗?你能给我提供完整的例子吗?看看关于如何读写数据的颤振的例子,你能给我提供完整的例子吗?