Android 颤振:如何存储';偏好列表';使用共享优先权

Android 颤振:如何存储';偏好列表';使用共享优先权,android,flutter,Android,Flutter,这个问题是关于如何在列表中保留喜爱的项目,即使在我重新打开应用程序之后 我想将doaList中的收藏项保存到favDoa中,即使在我关闭应用程序并重新打开它之后。我在flutter中看到了共享_首选项包来存储数据,但我不知道如何在我的应用程序中实现它。这是我的密码: import 'package:flutter/material.dart'; import 'package:json_test/class/doa.dart'; import 'package:json_test/page/Do

这个问题是关于如何在列表中保留喜爱的项目,即使在我重新打开应用程序之后

我想将doaList中的收藏项保存到favDoa中,即使在我关闭应用程序并重新打开它之后。我在flutter中看到了共享_首选项包来存储数据,但我不知道如何在我的应用程序中实现它。这是我的密码:

import 'package:flutter/material.dart';
import 'package:json_test/class/doa.dart';
import 'package:json_test/page/DoaPage.dart';

class MainPage extends StatefulWidget {
  @override
  _MainPageState createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  List<Doa> doaList;
  List<Doa> favDoa;
  bool _isInit = true;

  Future<void> fetchDoa(BuildContext context) async {
    final jsonstring =
        await DefaultAssetBundle.of(context).loadString('assets/doa.json');
    doaList = doaFromJson(jsonstring);
    _isInit = false;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text("JSON Data test"),
        ),
        body: Container(
            child: FutureBuilder(
                future: _isInit ? fetchDoa(context) : Future(null),
                builder: (context, _) {
                  if (doaList.isNotEmpty) {
                    return ListView.builder(
                      itemCount: doaList.length,
                      itemBuilder: (BuildContext context, int index) {
                        Doa doa = doaList[index];
                        return Card(
                            margin: EdgeInsets.all(8),
                            child: ListTile(
                                title: Text(doa.judul),
                                onTap: () {
                                  Navigator.of(context).push(MaterialPageRoute(
                                      builder: (BuildContext context) =>
                                          DoaPage(
                                            doa: doa,
                                          )));
                                },
                                trailing: IconButton(
                                  icon: Icon(
                                    doa.fav
                                        ? Icons.favorite
                                        : Icons.favorite_border,
                                    color: doa.fav ? Colors.red : null,
                                  ),
                                  onPressed: () => setState(() {
                                    doa.fav = !doa.fav;
                                  }),
                                )));
                      },
                    );
                  }
                  return CircularProgressIndicator();
                })));
  }
}
  class SharedPrefs {
  static SharedPreferences _sharedPrefs;
  init() async {
    if (_sharedPrefs == null) {
      _sharedPrefs = await SharedPreferences.getInstance();
    }
  }

  List<int> favoriteList;
  List<String> stringFavoriteIds =
      favoriteList.map((e) => e.toString()).toList();
  SharedPrefs().favoriteIds = stringFavoriteIds ;

  String get username => _sharedPrefs.getString(keyUsername) ?? "";

  set username(String value) {
    _sharedPrefs.setString(keyUsername, value);
  }
}
导入“包装:颤振/材料.省道”;
导入“package:json_test/class/doa.dart”;
导入“package:json_test/page/DoaPage.dart”;
类MainPage扩展了StatefulWidget{
@凌驾
_MainPageState createState()=>\u MainPageState();
}
类_MainPageState扩展状态{
列表列表;
列出favDoa;
bool_isInit=true;
未来fetchDoa(BuildContext上下文)异步{
最终jsonstring=
等待DefaultAssetBundle.of(context.loadString('assets/doa.json');
doaList=doaFromJson(jsonstring);
_isInit=假;
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“JSON数据测试”),
),
主体:容器(
孩子:未来建设者(
future:_isInit?fetchDoa(上下文):future(null),
构建器:(上下文,ux){
if(doaList.isNotEmpty){
返回ListView.builder(
itemCount:doaList.length,
itemBuilder:(构建上下文,int索引){
Doa Doa=doaList[索引];
回程卡(
保证金:全部(8),
孩子:ListTile(
标题:文本(doa.judul),
onTap:(){
导航器.of(上下文).push(MaterialPageRoute(
生成器:(BuildContext上下文)=>
多帕奇(
doa:doa,
)));
},
尾随:图标按钮(
图标:图标(
doa.fav
?图标。收藏
:Icons.favorite_边框,
颜色:doa.fav?颜色。红色:空,
),
按下时:()=>设置状态(){
doa.fav=!doa.fav;
}),
)));
},
);
}
返回循环ProgressIndicator();
})));
}
}
当我单击列表中的收藏夹图标时,它将在“doa.fav”中标记为true。如何在代码中实现共享_首选项包来保存doa.fav的数据?非常感谢您的回答:)

试试这个:

  • 创建一个整数列表来存储Doa ID,比如您将其命名为
    favoriteList
  • 每次单击favorite按钮时,将Doa的id添加到
    favoriteList
    。还将其保存到共享的_首选项。它只支持字符串列表,因此您需要首先转换它,例如:
  • 列出StringFavoriteID=
    favoriteList.map((e)=>e.toString()).toList();
    SharedPrefs().FavoriteId=StringFavoriteId;
    
  • 接下来,每次打开应用程序时,将
    SharedPrefs().FavoriteId
    加载到
    favoriteList
  • favoriteList
    中的Doa ID与您的Doa列表进行比较,将Doa.fav标记为true以匹配ID

  • 我已经创建了SharedPrefs类,下面是我的代码:

    import 'package:flutter/material.dart';
    import 'package:json_test/class/doa.dart';
    import 'package:json_test/page/DoaPage.dart';
    
    class MainPage extends StatefulWidget {
      @override
      _MainPageState createState() => _MainPageState();
    }
    
    class _MainPageState extends State<MainPage> {
      List<Doa> doaList;
      List<Doa> favDoa;
      bool _isInit = true;
    
      Future<void> fetchDoa(BuildContext context) async {
        final jsonstring =
            await DefaultAssetBundle.of(context).loadString('assets/doa.json');
        doaList = doaFromJson(jsonstring);
        _isInit = false;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text("JSON Data test"),
            ),
            body: Container(
                child: FutureBuilder(
                    future: _isInit ? fetchDoa(context) : Future(null),
                    builder: (context, _) {
                      if (doaList.isNotEmpty) {
                        return ListView.builder(
                          itemCount: doaList.length,
                          itemBuilder: (BuildContext context, int index) {
                            Doa doa = doaList[index];
                            return Card(
                                margin: EdgeInsets.all(8),
                                child: ListTile(
                                    title: Text(doa.judul),
                                    onTap: () {
                                      Navigator.of(context).push(MaterialPageRoute(
                                          builder: (BuildContext context) =>
                                              DoaPage(
                                                doa: doa,
                                              )));
                                    },
                                    trailing: IconButton(
                                      icon: Icon(
                                        doa.fav
                                            ? Icons.favorite
                                            : Icons.favorite_border,
                                        color: doa.fav ? Colors.red : null,
                                      ),
                                      onPressed: () => setState(() {
                                        doa.fav = !doa.fav;
                                      }),
                                    )));
                          },
                        );
                      }
                      return CircularProgressIndicator();
                    })));
      }
    }
    
      class SharedPrefs {
      static SharedPreferences _sharedPrefs;
      init() async {
        if (_sharedPrefs == null) {
          _sharedPrefs = await SharedPreferences.getInstance();
        }
      }
    
      List<int> favoriteList;
      List<String> stringFavoriteIds =
          favoriteList.map((e) => e.toString()).toList();
      SharedPrefs().favoriteIds = stringFavoriteIds ;
    
      String get username => _sharedPrefs.getString(keyUsername) ?? "";
    
      set username(String value) {
        _sharedPrefs.setString(keyUsername, value);
      }
    }
    
    类SharedPrefs{
    静态共享引用\u共享引用;
    init()异步{
    if(_sharedPrefs==null){
    _sharedPrefs=等待SharedPreferences.getInstance();
    }
    }
    列表收藏夹列表;
    列出StringFavoriteID=
    favoriteList.map((e)=>e.toString()).toList();
    SharedPrefs().FavoriteId=StringFavoriteId;
    字符串获取用户名=>\u sharedPrefs.getString(keyUsername)?“”;
    设置用户名(字符串值){
    _sharedPrefs.setString(keyUsername,value);
    }
    }
    
    这是我发现的错误消息

    哇,非常感谢吉米的回答。我会试试你的建议。希望你永远健康!我在插入代码时发现错误:(.让我在下面的回答栏中描述它。它不应该在SharedPrefs类中,而是在您最喜欢的按钮的onTap()中)。使用SharedPrefs中的getter和setter。这里有一个很好的共享首选项教程:不要忘记在添加收藏夹时将Id添加到收藏夹列表中,在删除收藏夹时将Id从收藏夹列表中删除,然后将列表保存到共享首选项www,好的。非常感谢jimmy的回答:D我很好很高兴你的回答:)