Android 颤振:如何存储';偏好列表';使用共享优先权
这个问题是关于如何在列表中保留喜爱的项目,即使在我重新打开应用程序之后 我想将doaList中的收藏项保存到favDoa中,即使在我关闭应用程序并重新打开它之后。我在flutter中看到了共享_首选项包来存储数据,但我不知道如何在我的应用程序中实现它。这是我的密码: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
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的数据?非常感谢您的回答:)
试试这个:
favoriteList
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我很好很高兴你的回答:)