Сохранение переменной списка при изменении - PullRequest
1 голос
/ 29 мая 2020

Я сейчас изучаю 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, но это кажется излишним, поэтому я не уверен в других вариантах. Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 29 мая 2020

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

Параметры:

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

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

В качестве примечания, строка bookmarked = bookmarked; бесполезна.

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

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

...