Flutter / Dart,无法将变量设置为json资产中的值

时间:2019-01-13 16:18:39

标签: android json dart flutter

我的资产文件夹中有一个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;

1 个答案:

答案 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) {