【发布时间】: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