#flutter #set #sharedpreferences
#flutter #установить #sharedpreferences
Вопрос:
Я хочу распечатать все содержимое sharedpreferences (ключ, значение)
Ключи и значения задаются пользователем
Я попытался поместить все ключи в набор, используя метод getKeys (), затем выполнить цикл Set и получить мои элементы следующим образом:
_favoritePlaces() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
// prefKeys declared as static Set<String>
prefKeys=prefs.getKeys();
if (prefKeys.isNotEmpty) {
for (int i = 0; i < prefKeys.length; i ) {
// this is another function expects to find key given as parameter
_drawerItem(prefKeys.elementAt(i).toString());
// expected output should come below
}
}
}
Ожидаемый результат :
Ключ0 => Значение0
Комментарии:
1. вы получаете сообщение об ошибке? что происходит не так?
2. всякий раз, когда я добавляю print(prefKeys.ElementAt(0)) Исключение : виджет направленности не найден
3. итак, проблема возникает только в том случае, если вы добавляете строку в цикл for ‘print(prefKeys.ElementAt (0));’?
4. моя проблема заключается в том, чтобы напрямую печатать все ключи и значения из sharedprefrences, но здесь я использовал set (collection) для решения проблемы, но я не знаю, является ли это эффективным способом сделать это, если я не могу повторно получать данные непосредственно из prefs
Ответ №1:
Я беспокоюсь, что нет такого открытого (общедоступного) API, чтобы получить все префы сразу с помощью плагина shared_preferences.
Вам нужно сделать это самостоятельно. Это сработало для меня:
class MainPage extends StatelessWidget {
Future<List<Widget>> getAllPrefs() async {
final SharedPreferences prefs = await PrefStore().prefs;
return prefs
.getKeys()
.map<Widget>((key) => ListTile(
title: Text(key),
subtitle: Text(prefs.get(key).toString()),
))
.toList(growable: false);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<List<Widget>>(
future: getAllPrefs(),
builder: (context, snapshot) {
if (!snapshot.hasData) return Container();
return ListView(
children: snapshot.data,
);
}),
);
}
}
Ответ №2:
Мне нужна Map
была пара общих настроек ключ значение, совместное использование, если кому-то это нужно.
Future<Map<String, String>> getAllPrefs() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
return <String, String>{
for (String key in prefs.getKeys()) ...{key: prefs.get(key).toString()}
};
}
Ответ №3:
Я откопал код для shared_preferences и обнаружил, что они могут получить все префы сразу, напрямую вызывая метод на methodChannel (что я не рекомендую, поэтому я также сохранил старый ответ).
Вот как вы можете это сделать
const MethodChannel _kChannel =
MethodChannel('plugins.flutter.io/shared_preferences');
final Map<Object, Object> fromSystem =
await _kChannel.invokeMethod('getAll');
print(fromSystem);
fromSystem
это то Map
, что имеет все значения.
Примечание: следует отметить, что все ключи имеют префикс «flutter»., например, «user_id» станет «flutter.user_id».
Комментарии:
1. Не могли бы вы объяснить, почему вы не рекомендуете? Для меня это работает очень хорошо.
2. Поскольку связь по каналу MethodChannel является внутренней для плагина, они могут несколько раз вносить критические изменения без изменения общедоступных методов. Вот и все.
Ответ №4:
Тот же код, что и в правильном ответе выше, но с flutter 2 «нулевая безопасность»:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class MainPage extends StatelessWidget {
Future<List<Widget>> getAllPrefs() async {
final prefs = await SharedPreferences.getInstance();
return prefs
.getKeys()
.map<Widget>((key) => ListTile(
title: Text(key),
subtitle: Text(prefs.get(key).toString()),
))
.toList(growable: false);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder<List<Widget>>(
future: getAllPrefs(),
builder: (context, snapshot) {
if (!snapshot.hasData) return Container();
return ListView(
children: snapshot.data!,
);
}),
);
}
}