我的资产文件夹中有一个json文件。 json文件将状态保存到我的设置页面上的开关。我有一些代码将读取json文件并对其进行解码。
JSON:
{
"ThemeColour" : "blue",
"HighlightState" : false,
"DisplayState" : true
}
代码:
class Settings {
final String themeColour;
final bool highlightState;
final bool displayState;
Settings(this.themeColour, this.highlightState,this.displayState);
}
class SettingsPage extends StatefulWidget {
@override
State createState() => new SettingsPageState();
}
class SettingsPageState extends State<SettingsPage> {
//---------------------------------------
//Load JSON savedSettings
//---------------------------------------
Future loadSavedSettings() async {
String jsonSavedSettings = await _loadSettingsAsset();
Settings savedSettings = _parseJsonForSettings(jsonSavedSettings);
print(savedSettings.displayState);
}
Future<String> _loadSettingsAsset() async {
return await rootBundle.loadString('assets/json/savedSettings.json');
}
Settings _parseJsonForSettings(String jsonString) {
Map decoded = jsonDecode(jsonString);
return Settings(decoded['themeColour'], decoded['HighlightState'], decoded['DisplayState']);
}
//---------------------------------------
@override
Widget build(BuildContext context) {
loadSavedSettings();
bool _highlightState = false;
bool _displayState = false;
在loadSavedSettings()中有print
时,它会打印出正确的值。但是我似乎无法理解它,以使代码底部的两个布尔值等于json文件中的相应值。
bool _highlightState = HighlightState value in json file;
bool _displayState = DisplayState value in json file;
答案 0 :(得分:1)
只需分配值并使用setState(...)
,以便在设置值后再次执行build()
。
Future loadSavedSettings() async {
String jsonSavedSettings = await _loadSettingsAsset();
Settings savedSettings = _parseJsonForSettings(jsonSavedSettings);
print(savedSettings.displayState);
setState(() {
_highlightState = savedSettings.highlightState;
_displayState = savedSettings.displayState;
});
}
此代码
@override
Widget build(BuildContext context) {
loadSavedSettings();
bool _highlightState = false;
bool _displayState = false;
需要更改为
bool _highlightState = false;
bool _displayState = false;
@override
void initState() {
super.initState();
loadSavedSettings();
}
@override
Widget build(BuildContext context) {