Как сохранить 2 переменные с помощью SharedPreferences? - PullRequest
0 голосов
/ 25 мая 2020

Я попытался создать приложение, которое должно сохранять две переменные с sharedPreferences без написания кода sharedPreferences два раза. Поэтому я написал приведенный ниже код и использовал переменную nameKey для места, где значение должно быть сохранено, и я использовал safeVariable для значения, которое должно быть сохранено. У меня есть две разные переменные, которые нужно сохранить: counter1 (значение + 1 при нажатии кнопки) и counter2 (значение - 1 при нажатии кнопки). У меня проблема в том, что обе переменные становятся меньше на единицу, но только одна переменная counter2 должна делать это. Кто-нибудь находит ошибку в моем коде? Это код:

class _MyHomePageState extends State<MyHomePage> {
  int counter1 = 0;
  int counter2 = 20;
  String nameKey = "eins";
  int safeVariable;

  void _incrementCounter() {
    setState(
      () {
        counter1++;
        counter2--;

        nameKey = "eins";
        safeVariable = counter1;
        save();

        nameKey = "zwei";
        safeVariable = counter2;
        save();
      },
    );
  }

  @override
  void initState() {
    super.initState();
  }

  Future<bool> save() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    return await preferences.setInt(nameKey, safeVariable);
  }

  Future<int> load() async {
    SharedPreferences preferences = await SharedPreferences.getInstance();
    return preferences.getInt(nameKey);
  }

  set() {
    load().then((value) {
      setState(() {
        safeVariable = value;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    nameKey = "eins";
    set();
    counter1 = safeVariable;

    nameKey = "zwei";
    set();
    counter2 = safeVariable;

    return Scaffold(
      appBar: AppBar(
        title: Text("Test"),
      ),
      body: Center(
        child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'You have pushed the button this many times:',
              ),
              Text(counter1.toString(),
                  style: Theme.of(context).textTheme.headline4),
              Text(counter2.toString(),
                  style: Theme.of(context).textTheme.headline4),
              FloatingActionButton(
                onPressed: _incrementCounter,
                child: Icon(Icons.add),
              ),
            ]),
      ),
    );
  }
}

1 Ответ

0 голосов
/ 25 мая 2020

Вам нужно дождаться окончания операции save () следующим образом: In:

void _incrementCounter() {
    setState(
      () {
        counter1++;
        counter2--;

        nameKey = "eins";
        safeVariable = counter1;
        save();

        nameKey = "zwei";
        safeVariable = counter2;
        save();
      },
    );
  }

поставьте «await»:

await save();

Если вы хотите сохранить в SharedPreferences сразу несколько значений. Вы можете загрузить / сохранить только список строк (List). Вот как это сделать:

prefs.setStringList("key", ["a","b","c"]);

Если у вас есть целые числа, вам нужно преобразовать каждый int в строку.

List<String> mylist = ["$counter1","$counter2"];
...