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
Flutter 颤振:如何使用Riverpod与SharedReference和List一起使用<;字符串>;多页变量?_Flutter_Dart_Provider_Riverpod - Fatal编程技术网

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)。你想帮我复习吗