Dart 弹出设置页面时加载SharedReference值
为了解决这个问题,我已经挣扎了好几天了。我扩展了长笛udacity课程,以帮助创建自己的应用程序,但进展并不顺利。在我的应用程序的背景中,我用从我的项目中的json文件获取的项目列表填充屏幕。该列表包含指向“我的资产”文件夹的路径,当用户点击listview中的listtile时,将在其中播放音频文件。当应用程序启动时,一切正常,但我添加了一个设置页面,用户可以更改音频音量,但它不工作。在我的settins页面中,我有一个滑块,其值保存在SharedReferences中,如下所示:Dart 弹出设置页面时加载SharedReference值,dart,flutter-layout,Dart,Flutter Layout,为了解决这个问题,我已经挣扎了好几天了。我扩展了长笛udacity课程,以帮助创建自己的应用程序,但进展并不顺利。在我的应用程序的背景中,我用从我的项目中的json文件获取的项目列表填充屏幕。该列表包含指向“我的资产”文件夹的路径,当用户点击listview中的listtile时,将在其中播放音频文件。当应用程序启动时,一切正常,但我添加了一个设置页面,用户可以更改音频音量,但它不工作。在我的settins页面中,我有一个滑块,其值保存在SharedReferences中,如下所示: _sav
_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);
});
},
),
),
)
即使在应用程序重新启动后,我仍然设法保持滑块值不变。请在ini状态()中读取值。
在第一次启动时,当前卷值加载没有问题,但当我导航到设置页面并返回时,该值保持不变
我在inistate()
中读取了我的共享首选项值,并调用setstate()
以确定是否调用了它。我也试着从didChangeDependencies()
和didUpDateWidgets()
中读取,但是没有调用它们。我还尝试将一个UniqueKey()
传递给我的Listtile,它用音频文件填充listview,但不起作用
还有一件事是当导航器在我的background.dart中弹出设置页面时调用setState
onPressed: () {
Navigator.push(context,
MaterialPageRoute(builder: (context) => Settings()))
.then((value) {
setState(() {
// refresh state of the BackDrop
});
});
},
和设置。省道
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;
});
}
///在给定[Word]列表的情况下,创建[LIstTile]小部件的新列表。
void _createWordList(){
final_audioCache=audioCache();
var newLists=[];
_ReadSharedReferences();
for(widget.category.words中的var单词){
newLists.add(
卡片(
孩子:ListTile(
前导:word.emoji==“”?空:Image.asset(word.emoji),
标题:文本(word.english),
字幕:文本(
阿肯先生,
样式:TextStyle(颜色:Colors.black,fontSize:16.0),
),
尾随:图标(
图标。播放箭头,
尺寸:28.0,
),
onTap:(){
_audioCache.play(word.audio,音量:_volume);
},
),
),
);
}
设置状态(){
_单词列表=新列表;
});
}
还有什么我可以尝试的吗?通过阅读构建方法中的首选项解决了这个问题。我甚至不知道为什么我有时会在这里发帖
/// 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;
});
}