Flutter 颤振:如何使用Riverpod与SharedReference和List一起使用<;字符串>;多页变量?
我已经创建了Flutter 颤振:如何使用Riverpod与SharedReference和List一起使用<;字符串>;多页变量?,flutter,dart,provider,riverpod,Flutter,Dart,Provider,Riverpod,我已经创建了List favId=[]变量,用于存储带有SharedReferences的项目ID,因此在我重新启动应用程序后,首选项目ID不会丢失。下面是我的SharedReferences方法和最喜欢的图标按钮detailDoaPage.dart: ... static List<String> favId = []; getData() async { SharedPreferences pref = await SharedPreferences.getInst
List favId=[]代码>变量,用于存储带有SharedReferences的项目ID,因此在我重新启动应用程序后,首选项目ID不会丢失。下面是我的SharedReferences方法和最喜欢的图标按钮detailDoaPage.dart:
...
static List<String> favId = [];
getData() async {
SharedPreferences pref = await SharedPreferences.getInstance();
setState(() {
favId = pref.getStringList("id") ?? [];
});
}
void initState() {
super.initState();
getIds();
}
getIds() async {
favId = getData();
}
void saveData() async {
SharedPreferences pref = await SharedPreferences.getInstance();
pref.setStringList("id", favId);
}
...
IconButton(
icon: Icon(
favId.contains(doa.id.toString())
? Icons.favorite
: Icons.favorite_border,
color: favId.contains(doa.id.toString())
? Colors.red
: Colors.grey,
),
onPressed: () => setState(() {
doa.fav = !doa.fav;
if (favId.contains(doa.id.toString())) {
favId.removeWhere(
(element) => element == doa.id.toString());
} else {
favId.add(doa.id.toString());
}
saveData();
favId.sort();
}),
)
。。。
静态列表favId=[];
getData()异步{
SharedReferences pref=等待SharedReferences.getInstance();
设置状态(){
favId=pref.getStringList(“id”)??[];
});
}
void initState(){
super.initState();
getIds();
}
getIds()异步{
favId=getData();
}
void saveData()异步{
SharedReferences pref=等待SharedReferences.getInstance();
pref.setStringList(“id”,favId);
}
...
图标按钮(
图标:图标(
favId.contains(doa.id.toString())
?图标。收藏
:Icons.favorite_边框,
颜色:favId.contains(doa.id.toString())
?颜色:红色
:颜色。灰色,
),
按下时:()=>设置状态(){
doa.fav=!doa.fav;
if(favId.contains(doa.id.toString()){
favId.removehere(
(element)=>element==doa.id.toString());
}否则{
favId.add(doa.id.toString());
}
saveData();
favId.sort();
}),
)
除此之外,我还想在favPage.dart(另一个页面)中使用ListView.builder显示最喜欢的项目。我当然想从detailDoaPage.dart得到最爱。我如何在这两个页面上实现提供者/riverpod
以下是我的应用程序预览:
谢谢:)我推荐的方法是创建一个StateNotifier来处理状态以及与SharedReference的交互。以下内容也简化了小部件中的逻辑
final sharedPrefs=
FutureProvider((41; async=>wait sharedReferences.getInstance());
类FavoriteIds扩展StateNotifier{
FavoriteID(this.pref):super(pref?.getStringList(“id”)??[]);
静态最终提供程序=StateNotifierProvider((ref){
最终优先权=参考手表(共享优先权)。可能在何时(
数据:(值)=>值,
orElse:()=>null,
);
返回收藏夹ID(pref);
});
最终共享参考?优先;
无效切换(字符串收藏夹ID){
if(state.contains(favoriteId)){
state=state.where((id)=>id!=favoriteId.toList();
}否则{
state=[…state,favoriteId];
}
//由于某些原因,无法检索SharedReferences,因此在此抛出
pref!.setStringList(“id”,状态);
}
}
用法:
类DoaWidget扩展了ConsumerWidget{
constdoawidget({Key?Key,需要this.doa}):super(Key:Key);
最终波达方向;
@凌驾
小部件构建(BuildContext上下文,ScopeDrawer监视){
final-favoriteId=watch(favoriteId.provider);
返回图标按钮(
图标:FavoriteID。包含(“”)?图标(Icons.favorite):图标(Icons.favorite_边框),
颜色:FavoriteID。包含(“”)颜色。红色:颜色。灰色,
onPressed:()=>context.read(favoriteID.provider.notifier).toggle(doa.id.toString()),
);
}
}
我推荐的方法是创建一个StateNotifier来处理状态以及与SharedReference的交互。以下内容也简化了小部件中的逻辑
final sharedPrefs=
FutureProvider((41; async=>wait sharedReferences.getInstance());
类FavoriteIds扩展StateNotifier{
FavoriteID(this.pref):super(pref?.getStringList(“id”)??[]);
静态最终提供程序=StateNotifierProvider((ref){
最终优先权=参考手表(共享优先权)。可能在何时(
数据:(值)=>值,
orElse:()=>null,
);
返回收藏夹ID(pref);
});
最终共享参考?优先;
无效切换(字符串收藏夹ID){
if(state.contains(favoriteId)){
state=state.where((id)=>id!=favoriteId.toList();
}否则{
state=[…state,favoriteId];
}
//由于某些原因,无法检索SharedReferences,因此在此抛出
pref!.setStringList(“id”,状态);
}
}
用法:
类DoaWidget扩展了ConsumerWidget{
constdoawidget({Key?Key,需要this.doa}):super(Key:Key);
最终波达方向;
@凌驾
小部件构建(BuildContext上下文,ScopeDrawer监视){
final-favoriteId=watch(favoriteId.provider);
返回图标按钮(
图标:FavoriteID。包含(“”)?图标(Icons.favorite):图标(Icons.favorite_边框),
颜色:FavoriteID。包含(“”)颜色。红色:颜色。灰色,
onPressed:()=>context.read(favoriteID.provider.notifier).toggle(doa.id.toString()),
);
}
}
我可以试着为您指出正确的方向。您想要做的与riverpod文档中的非常相似。您可以像对待bool completed
一样对待您的bool isFavoriteDoa
。这只是两个代码文件,请查看它们并尝试在应用程序中实现相同的解决方案。@ambiguous58哇,非常感谢您的建议。是的,我会学习:)我可以试着给你指出正确的方向。您想要做的与riverpod文档中的非常相似。您可以像对待bool completed
一样对待您的bool isFavoriteDoa
。这只是两个代码文件,请查看它们并尝试在应用程序中实现相同的解决方案。@ambiguous58哇,非常感谢您的建议。是的,我会学习:)对不起,我还是有点困惑。这是我的两页代码(detailDoaPage.dart和favPage.dart)。你想帮我复习吗