Flutter bool name = String это возможно?

#flutter #boolean

#флаттер #логическое значение

Вопрос:

Эй, я создаю любимую систему с помощью bool, чтобы указать, является ли она любимой или нет.

Но если имя bool всегда одно и то же, оно применяется ко всем моим записям!

но каждая запись имеет свое собственное имя (widget.name ), и я подумал, что, может быть, что-то подобное могло бы сработать

 bool widget.name;
  

но это не сработает:(

как я могу решить, что каждая запись имеет свой собственный bool?

кстати, я использую этот плагин для этого https://pub.dev/packages/shared_preferences/example

 SharedPreferences sharedPreferences;
bool isfavorit;

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

    SharedPreferences.getInstance().then((SharedPreferences sp) {
      sharedPreferences = sp;
      isfavorit = sharedPreferences.getBool(spKey);
      // will be null if never previously saved
      if (isfavorit == null) {
        isfavorit = false;
        persist(isfavorit); // set an initial value
      }
      setState(() {});
    });
  }

    void persist(bool value) {
    setState(() {
      isfavorit = value;
    });
    sharedPreferences?.setBool(spKey, value);
  }
  

Полный код

 import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

class Details extends StatefulWidget {
  final String name;

  Details(
    this.name,
  );

  @override
  _DetailsState createState() => _DetailsState();
}

const String spKey = 'myBool';

class _DetailsState extends State<Details> {
  SharedPreferences sharedPreferences;
  bool isfavorit;

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

    SharedPreferences.getInstance().then((SharedPreferences sp) {
      sharedPreferences = sp;
      isfavorit = sharedPreferences.getBool(spKey);
      // will be null if never previously saved
      if (isfavorit == null) {
        isfavorit = false;
        persist(isfavorit); // set an initial value
      }
      setState(() {});
    });
  }

  void persist(bool value) {
    setState(() {
      isfavorit = value;
    });
    sharedPreferences?.setBool(spKey, value);
  }

// ignore: missing_return
  IconData favicon() {
    if (isfavorit == true) {
      return Icons.favorite;
    } else if (isfavorit == false) {
      return Icons.favorite_border;
    }
  }

// ignore: missing_return
  Color favicolor() {
    if (isfavorit == true) {
      return Colors.red;
    } else if (isfavorit == false) {
      return Colors.white;
    }
  }

  void changefav() {
    if (isfavorit == true) {
      return persist(false);
    } else if (isfavorit == false) {
      return persist(true);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          IconButton(
            icon: Icon(
              favicon(),
              color: favicolor(),
            ),
            onPressed: () => changefav(),
          ),
        ],
        title: Text(widget.name),
      ),
      body: Container(
        child: Text(widget.name),
      ),
    );
  }
}
  

Комментарии:

1. Пожалуйста, поделитесь соответствующим кодом, который у вас есть.

2. Можете ли вы поделиться всем виджетом

3. Обновите сообщение

Ответ №1:

Вы всегда сохраняете isFavorite один и тот же ключ в общих настройках, вместо использования постоянного ключа используйте тот, который основан на widget.name

Так, например:

 sharedPreferences.getBool('details_favorite_${widget.name}');
  

Комментарии:

1. где именно я должен его использовать или заменить?

2. везде, где вы используете spKey , используйте 'details_favorite_${widget.name}' вместо

3. Приятно, что сработало 🙂 теперь, как я могу загрузить все сохраненные имена bool в список, используя listbuilder? а на другой странице?

4. Проверьте метод getKeys общих настроек

5. хорошо, спасибо, но я все еще новичок, не могли бы вы дать мне пример кода, как я могу это реализовать?