【问题标题】:Load sharedpreference value when Settings page is popped弹出设置页面时加载 sharedpreference 值
【发布时间】:2020-11-19 15:59:05
【问题描述】:

我几天来一直在努力解决这个问题。我扩展了 Fluter udacity 课程以帮助创建我自己的应用程序,但进展并不顺利。在我的应用程序的背景下,我使用从项目中的 json 文件中获取的项目列表填充屏幕。该列表包含我的资产文件夹的路径,当用户点击列表视图中的列表拼贴时,其中有要播放的音频文件。当应用程序启动时一切正常,但我添加了一个设置页面,用户可以在其中更改音频的音量但它不起作用。在我的设置页面中,我有一个滑块,其值保存在这样的共享首选项中;

 _saveSharedPreferences(double volume) async {
_prefs = await SharedPreferences.getInstance();
await _prefs.setDouble(VolumeLevelPrefKey, volume);
}

每当滑块值发生变化时我都会调用它

  ListTile(
                leading: Icon(
                  Icons.volume_down_sharp,
                  color: Colors.red,
                ),
                trailing: Container(
                  width: 290.0,
                  child: Slider(
                    divisions: 10,
                    max: 100.0,
                    label: '${_volume.round()}',
                    activeColor: Colors.blue,
                    inactiveColor: Colors.red,
                    value: _volume,
                    onChanged: (double value) {
                      setState(() {
                        _volume = value;
                        _saveSharedPreferences(_volume);
                      });
                    },
                  ),
                ),
              )

即使在应用重新启动后,我也设法保持滑块值固定购买阅读 inistate() 中的值

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

 _readSharedPreferences() async {
_prefs = await SharedPreferences.getInstance();
_prefs.reload();
_volume = _prefs.getDouble(VolumeLevelPrefKey);
setState(() {});
}

在第一次启动时,当前的音量值加载没有问题,但是当我导航到设置页面并返回时,该值保持不变。

我在inistate() 中读取了我的共享偏好值并调用setstate() 只是为了确定,但我认为它没有被调用。我也尝试从didChangeDependencies()didUpDateWidgets() 阅读,但没有一个被调用。我还尝试将 UniqueKey() 传递给我的 Listtile,它用音频文件填充列表视图,但它不起作用。

当我的背景.dart 中的导航器弹出设置页面时,我还需要调用 setState。

 onPressed: () {
            Navigator.push(context,
                    MaterialPageRoute(builder: (context) => Settings()))
                .then((value) {
              setState(() {
                // refresh state of the BackDrop
              });
            });
          },

和 settings.dart

 leading: IconButton(
      icon: Icon(Icons.arrow_back),
      onPressed: () {
        Navigator.pop(context, true);
      },
    ),

我用 word_translation.dart 文件中的这个世界列表填充我的背景。

 /// Creates fresh list of [LIstTile] widgets, given a list of [Word]s.
void _createWordList() {
    final _audioCache = AudioCache();
    var newLists = <Widget>[];
    _readSharedPreferences();
    for (var word in widget.category.words) {
      newLists.add(
        Card(
          child: ListTile(
            leading: word.emoji == "" ? null : Image.asset(word.emoji),
            title: Text(word.english),
            subtitle: Text(
              word.akan,
              style: TextStyle(color: Colors.black, fontSize: 16.0),
            ),
            trailing: Icon(
              Icons.play_arrow,
              size: 28.0,
            ),
            onTap: () {
              _audioCache.play(word.audio, volume: _volume);
            },
          ),
        ),
      );
    }
    setState(() {
      _wordList = newLists;
    });
  }

还有什么我可以尝试的吗?

【问题讨论】:

    标签: dart flutter-layout


    【解决方案1】:

    通过阅读构建方法中的首选项解决了这个问题。我什至不知道为什么我有时会在这里发帖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-05
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多