Сохранение переменной списка при изменении

В настоящее время я изучаю Flutter и делаю приложение для личных финансов. У меня есть возможность добавить свои руководства в закладки, а затем просмотреть их на вкладке закладок. Прямо сейчас я использую список, чтобы просто хранить имена направляющих и отображать их в виде плиток списка.

Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда список закладок обновляется ВО ВРЕМЯ работы приложения, страница закладок загружает правильную информацию, но затем, когда я закрываю и перезапускаю приложение, оно возвращается к исходному пустому состоянию. Как я могу исправить это, чтобы приложение сохраняло вкладки с закладками?

main.dart

List<String> bookmarked = [];

String introInfo = """ <h1>Introduction!</h1>
<p><strong><em>NOTE: The guides are U.S. specific but most information can be applied in most countries outside the U.S.</em></strong></p>
<p>The guides in this app will teach you the basics of personal finance.</p>
<p>Financial knowledge is something that is invaluable but the U.S. education system does not put much emphasis on it. If you are looking to get into personal finance, you're at the right place.</p>""";

void main() {
  runApp(MaterialApp(
    initialRoute: '/',
    routes: {
      '/': (context) => MyApp(),
      '/finTable': (context) => FinNav(),
      '/disclaimer': (context) => Disclaimer(),
      '/intro': (context) => GuideStyle(guideName: 'introduction',guideInfo: introInfo, isFav: bookmarked.contains('introduction'),),
      '/budget': (context) => GuideStyle(guideName: 'budget',guideInfo: introInfo, isFav: bookmarked.contains('budget'),),
      '/bookmark': (context) => Bookmarks(),
    },
    theme: ThemeData(fontFamily: 'Raleway'),
  ));
}

/* I have a stateless widget that shows all pages and navigates to one the user selects */

guidestyle.dart

class GuideStyle extends StatelessWidget {
  String guideName;
  String guideInfo; 
  Widget previous;
  Widget next;
  bool isFav;
  GuideStyle({this.guideName,this.guideInfo, this.isFav });//this.next, this.previous});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Color.fromRGBO(220, 20, 60, 1.0),
          title: Text('Introduction'),
          centerTitle: true,
          elevation: 10.0,
          actions: <Widget>[
            Padding(
              padding: const EdgeInsets.fromLTRB(0.0,2.0,50.0,0.0),
              child: MyStatefulWidget(isFav: isFav,name: guideName,),
            ),
          ],
        ),
        body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.all(10.0),
              child: RaisedButton(
                onPressed: () {
                  Navigator.pop(context);
                },
                child: Text('Back'),
                textColor: Colors.white,
                color: Color.fromRGBO(220, 20, 60, 0.8),
              ),
            ),
            Expanded(
              child: SingleChildScrollView(
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: HtmlWidget(
                    guideInfo,
                  )
                ),
              ),
            ),
          ],
        ));
  }
}


class MyStatefulWidget extends StatefulWidget {
  bool isFav;
  String name;
  MyStatefulWidget({Key key, this.isFav, this.name}) : super(key: key);

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

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        IconButton(
          icon: widget.isFav ? Icon(Icons.bookmark, color: Colors.black) : Icon(Icons.bookmark_border),
          onPressed: () {
            setState(() {
              widget.isFav = !widget.isFav;
              if(widget.isFav){
                bookmarked.add(widget.name);
                bookmarked = bookmarked;
              }else{
                bookmarked.remove(widget.name);
                bookmarked = bookmarked;
              }
            });
          },
        ),
      ],
    );
  }
}

Как уже упоминалось, guidestyle.dart обновляет список во время работы приложения, но список сбрасывается при перезапуске приложения.

Я рассматривал возможность использования sqflite, но это кажется излишним, поэтому я не уверен в своих других вариантах. Любая помощь будет оценена по достоинству!


person Shiv Patel    schedule 29.05.2020    source источник
comment
Вы можете использовать shared_preferences для сохранения этих отмеченных элементов pub.dev/packages/shared_preferences.   -  person Ketan Ramteke    schedule 29.05.2020


Ответы (2)


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

Опции:

  • Сохраняйте данные с помощью SQLite (хотя вы не хотите его использовать, это все же вариант)
  • Чтение и запись файлов
  • Хранить данные «ключ-значение» на диске (SharedPreferences) — это самый простой способ, который, вероятно, отлично подойдет для ваших нужд.

Если вы используете SharedPreferences, метод setStringList идеально подойдет для ваших нужд.

Кстати, строка bookmarked = bookmarked; бесполезна.

person Christopher Moore    schedule 29.05.2020
comment
Спасибо! Я попробую часть SharedPreferences. Хотя, как я мог читать/записывать списки в файл? Я знаю, что в Java вы можете сериализовать список как объект, чтобы сохранить его в файл. Можно ли сделать что-то подобное для списков в Dart? Хотя мне нравятся SharedPreferences, я хотел бы хранить больше, чем просто строки. - person Shiv Patel; 29.05.2020
comment
@Shiv, вы можете сделать то же самое и сериализовать данные в дротике. В этом нет необходимости, так как вы можете просто записать данные в файл, это не обязательно должна быть строка. Вы также можете хранить другие распространенные типы данных в общих настройках, но вы также можете сериализовать любые данные и хранить их в общих настройках в виде строки. - person Christopher Moore; 29.05.2020

List<String> bookmarked = []; ваши данные всегда будут пустыми
Во-первых, вам нужно сохранить пакет shared_preferences или sqflite или т. д.
Вы можете найти здесь => https://pub.dev/
и проверьте наличие данных.
После этого if(hasData) bookmarked = "loaded data" else bookmarked = [];

person Taz    schedule 29.05.2020