共享首选项返回上次保存的bool的bool值- Flutter

ca1c2owp  于 2023-03-24  发布在  Flutter
关注(0)|答案(1)|浏览(118)

当我保存一个共享的偏好设置bool然后创建一个新的bool时,新的bool也是true,为什么?我认为它给出了上次保存的bool,因为当我重新启动应用程序时,有时一切都是假的,然后当我将一个从假更改为真时,一切都是真的。我不明白为什么会发生这种情况。有什么想法吗?(额外信息:我正在使用的数据库名为Person,它有一个名为Joined的bool,这是我正在更改的bool,但这并不重要,因为共享首选项不知道任何关于数据库的信息)以下是代码:HomePage.dart:

Widget listItem({
    required Map Person,
  }) {
    void savebool() async {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      await prefs.setBool("person_joined", Person['Joined']);
      // print("${Person}_joined");

      print("Person['Joined'] : ${Person['Joined']}");
    }

    return Slidable(
      startActionPane: ActionPane(
        motion: const BehindMotion(),
        extentRatio: 1 / 5,
        children: [
          SlidableAction(
            backgroundColor: Colors.blue,
            icon: Icons.add,
            label: 'Join',
            onPressed: (BuildContext context) {
              // print("Before update: ${Person['Joined']}");
              setState(() {
                Person['Joined'] = true;
              });
              // print("After update: ${Person['Joined']}");
              savebool();
            }...}

Expanded(
          child: FirebaseAnimatedList(
            query: dbRef,
            itemBuilder: (BuildContext context, DataSnapshot snapshot,
                Animation<double> animation, int index) {
              Map Person = snapshot.value as Map;

              String? rideKey = snapshot.key;
              Person['key'] = snapshot.key;

              if (Person['Date'] ==
                  DateFormat("d-MM-yyyy").format(_selectedDate)) {
                return listItem(Person: Person);
              } else {
                return Container();
              }
            },
          ),
        )

Favourites.dart(如果你点击了Join,我在这里添加Person):

late bool joined;
  //
  @override
  void initState() {
    super.initState();
    getBool();
  }

  void getBool() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      joined = prefs.getBool("person_joined") ?? false;
    });
  }

所以总结一下...一切都是假的(假设有3个person被创建),然后我点击Join上的一个,但然后所有三个都是真的,然后所有三个都在favourites page中,尽管只有一个应该是真的。请帮助!

tyg4sfes

tyg4sfes1#

共享首选项是整个应用程序的共享数据存储。如果您保存person_joined = true,则无论何时访问该值,它在整个应用程序中均相同。
因此,如果创建了3个人,并且一个人_joined变为真,则无论您从何处访问它(即,人1、2或3),它都将为真。
要使此值person依赖,您应该将其与该人的唯一标识符一起保存。例如。<username>_joined = true。这样,如果10个不同的人加入,则会有10个不同的标识符。

相关问题