【问题标题】:How to create a bool list in shared_preferences and store values ​there如何在 shared_preferences 中创建一个 bool 列表并在那里存储值
【发布时间】:2021-12-20 05:06:45
【问题描述】:
required this.favorite,

我像这样从上一页得到布尔值。由于我使用了pageview,所以我想像这样将值存储在索引中,以便以后使用。

  loadFavorite() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      favorite= prefs.getBoolList(_favoriteButton[index])!;
    });
  }


  void delete() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setBool(_favoriteButton[index], false);
    setState(() {
      favorite= prefs.getBool(_favoriteButton[index])!;
    });
  }

  void saved() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setBool(_favoriteButton[index], true);
    setState(() {
      favorite= prefs.getBool(_favoriteButton[index])!;
    });
  }

我在上一页中使用了上面的代码。这就是为什么我需要一个清单。如果没有它,我将不得不创建数百个页面。

  void loadFavorite() async{
    print(FavoriteButtons[0]);
    SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      favorite[0] = prefs.getBool(_favoriteButton[0])!;

是否可以从 shared_preferences 创建列表?以及如何将 bool 存储为列表?

【问题讨论】:

  • 首选使用 setString 将编码后的地图保存为字符串

标签: flutter dart flutter-sharedpreference


【解决方案1】:

你可以通过这个方法来保存bool列表:

List<bool> favorite = <bool>[];

Future<void> loadFavorite() async{
  SharedPreferences prefs = await SharedPreferences.getInstance();
  setState(() {
    favorite = (prefs.getStringList("userFavorite") ?? <bool>[]).map((value) => value == 'true').toList();
  });
}

Future<void> delete() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  setState(() {
    favorite[index] = false;
  });
  await prefs.setStringList("userFavorite", favorite.map((value) => value.toString()).toList());
  setState(() {
    favorite = (prefs.getStringList("userFavorite") ?? <bool>[]).map((value) => value == 'true').toList();
  });
}

Future<void> saved() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  setState(() {
    favorite[index] = true;
  });
  await prefs.setStringList("userFavorite", favorite.map((value) => value.toString()).toList());
  setState(() {
    favorite = (prefs.getStringList("userFavorite") ?? <bool>[]).map((value) => value == 'true').toList();
  });
}

【讨论】:

  • 首选使用 setString 将编码后的地图保存为字符串
  • 如何在 (prefs.getStringList("userFavorite") 中保存 List 收藏夹?我收到错误消息,因为 List 收藏夹在第一次运行时为 [] 为空应用程序。
  • 你可以像这样 prefs.getStringList("userFavorite") 做空处理?? []
【解决方案2】:

您可以尝试使用SharedPreferences.setStringList,仅将true 收藏按钮索引保存到列表中。像这样的东西(详见评论):

void save(int index, bool isFavorite) async {
   SharedPreferences prefs = await SharedPreferences.getInstance();
   var favorites = prefs.getStringList('favorites')??[];

   // index as string item
   var strIndex = index.toString();

   if(isFavorite) {
     // Save index to list only if it it not exist yet.
     if(!favorites.contains(strIndex)) {
        favorites.add(strIndex);
     }
   } else {
      // Remove only if strIndex exist in list.
      if(favorites.contains(strIndex)) {
        favorites.remove(strIndex); 
      }
   }

   // Save favorites back
   prefs.setStringList('favorites', favorites);
}

Future<bool> isFavorite(int index) async {
   SharedPreferences prefs = await SharedPreferences.getInstance();
   var favorites = prefs.getStringList('favorites')??[];

   // index as string item
   var strIndex = index.toString();

   // If index is exist, then it is must be true.
   if(favorites.contains(strIndex) {
      return true;
   }
   
   return false;  
}


 // All item index in list is always true
 Future<List<int>> getFavoriteIndexes() async {
   SharedPreferences prefs = await SharedPreferences.getInstance();
   var favorites = prefs.getStringList('favorites')??[];

   var indexes = <int>[];
   for(var favIndex in favorites) {
       // return -1 if invalid fav index found
       int index = int.tryParse(favIndex) ?? -1;
       if(val != -1) {
          indexes.add(index);
       }
   }

    return indexes;
 }

请注意,该代码尚未经过测试。

【讨论】:

  • 上面的代码是不是这样保存的'favorite[index]'?代码太长了还没弄明白。
【解决方案3】:

您只能将List&lt;String&gt; 存储在SharedPreferences 中,但您可以在读取/写入时轻松地将列表转换为布尔值。

// List<bool> --> List<String>
boolValues.map((value) => value.toString()).toList();

// List<String> --> List<bool>
stringValues.map((value) => value == 'true').toList();

【讨论】:

    【解决方案4】:

    与其将其保存为列表,不如将其单独保存为索引,例如 prefs.setBool('favoritrButton$index', isFavorite) 索引将是动态的。因此,当您检索保存的布尔值时,您可以使用 prefs.getBool('favoriteButton$index');

    然后你可以使用像这样的保存方法

          void save(int index, bool isFavorite) async {
             SharedPreferences prefs = await SharedPreferences.getInstance();
              prefs.setBool('favoriteButton$index', isFavorite);
           }
    

    并获得喜爱

      Future<Bool> isFavorite(int index) async {
       SharedPreferences prefs = await SharedPreferences.getInstance();
    return prefs.getBool('favoritrButton$index')??true;
    //?? true will return true if it's null
    }
    

    【讨论】:

      【解决方案5】:

      如果您将布尔值存储在一些生成的键(如 index.toString();)下,则可以构建一个可索引的布尔列表;

      List boolist = List.empty(growable: true);
      
      void loadList() async {
          final prefs = await SharedPreferences.getInstance();
          setState(() {
            prefs.getStringList('list')?.forEach((indexStr) {
              //this will add the booleans stored in prefs under the indexStr key
              boolist.add(prefs.getBool(indexStr));
              
            });
          });
      

      您现在可以随心所欲地处理布尔列表,您只需要在完成后保存新的首选项字符串列表和布尔值

      void saveList() async {
              final prefs = await SharedPreferences.getInstance();
              List<String> transfer = List<String>.empty(growable: true);
              //this transfer list is needed so you can store your indexes as strings
              int index = 0;
              boollist.forEach((element) {
                   //here you just populate the transfer list for every value in in your boolist and save the appropiate boolean values
                   transfer.add(index.toString());
                   prefs.setBool(index.toString(), element);
                   index++
                 });
              setState(() {
                  // save the new index string list
                  prefs.setStringList('list', transfer);
                  
                });
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多