【问题标题】:Flutter loading data from SharedPreference before the page loads在页面加载之前 Flutter 从 SharedPreference 加载数据
【发布时间】:2021-09-22 09:08:15
【问题描述】:

我从 ListString 中提取多个数据,然后用 For 循环将它们分开,创建一个对象,然后将其添加到列表中,然后将此列表添加到另一个列表中,然后 DropDownList 在该列表中添加元素。但问题是当我尝试将列表(对象列表)添加到另一个列表(DropDownList 列表)时,我无法添加元素。

代码:

    late String selectedValue = '';
  List<String> dropDownItemValue = [];
  List<NotePages> notePages = [];
  final List<NotePages> pages = [];

  Future<NotePages?> read() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    var keys = prefs.getKeys();

    for (var key in keys) {
      var pageList = prefs.getStringList(key);

      if (pageList?[0] == 'page') {
        NotePages page = new NotePages(
            type: pageList![0],
            pageName: pageList[1],
            createdTime: DateTime.parse(pageList[2]));

        pages.add(page);
        await addInTheList();
      }
    }
  }

  addInTheList() {
    for (var i = 0; i < pages.length; i++) {
      notePages.add(pages[i]);
      print(pages[i]);
    }
  }

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

    read();

    for (var i = 0; i < notePages.length; i++) {
      dropDownItemValue.add(notePages[i].pageName);
    }
    dropDownItemValue.add('');
    dropDownItemValue.add('Add Page');
    print(dropDownItemValue);
    // selected value must be contain at dropDownItemValue
    selectedValue = dropDownItemValue[0];
  }

当我在 initState 中使用 Then() 时,该列表将元素添加到另一个列表中,我的意思是它正在工作(我可以在打印最后一个列表时看到)但我无法打开 DropDownList 它的行为就像他没有元素。像这样的代码:

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

    read().then((_) => {
          for (var i = 0; i < pages.length; i++) {notePages.add(pages[i])},

          for (var i = 0; i < notePages.length; i++)
            {dropDownItemValue.add(notePages[i].pageName)},
          dropDownItemValue.add(''),
          dropDownItemValue.add('Add Page'),
          print(dropDownItemValue),
          // selected value must be contain at dropDownItemValue
          selectedValue = dropDownItemValue[0],
        });
  }

我该如何解决这个问题?

【问题讨论】:

  • 你需要在then回调中调用setState来重建你的小部件,或者如果你有一些Future附带的数据,则只需使用FutureBuilder
  • 谢谢你,我累了setState 但没用我会检查FutureBuilderGetStorage

标签: flutter dart


【解决方案1】:

我推荐使用GetStorage

https://pub.dev/packages/get_storage

它是实时的,因此您不需要任何异步或未来构建器或任何东西。

只需将此行添加到您的 main 函数中:

void main() async {
  await GetStorage.init();
  runApp(MyApp());
}

然后像魅力一样使用它......

void setData(String key, dynamic value) => GetStorage().write(key, value);

int? getInt(String key) => GetStorage().read(key);

String? getString(String key) => GetStorage().read(key);

bool? getBool(String key) => GetStorage().read(key);

double? getDouble(String key) => GetStorage().read(key);

dynamic getData(String key) => GetStorage().read(key);

void clearData() async => GetStorage().erase();

【讨论】:

  • 谢谢你,我会试试这个,实际上实时听起来很酷。
  • @cançağlarkırıcı 欢迎您,乐于提供帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 2018-01-16
  • 2022-01-17
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多