【问题标题】:Flutter/Dart, cannot set a variable to a value from a json assetFlutter/Dart,无法将变量设置为 json 资产中的值
【发布时间】:2019-06-07 19:22:00
【问题描述】:

我的资产文件夹中有一个 json 文件。 json 文件将状态保存到我的设置页面上的开关。我有一些代码将读取 t5he 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;

【问题讨论】:

    标签: android json dart flutter


    【解决方案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) {
    

    【讨论】:

    • 我在_highlightState = savedSettings['HighlightState']; 上收到以下错误:Error: The method '[]' isn't defined for the class '#lib1::Settings'
    • 我错过了您将数据包装在一个类中。你有一个错字(不相关)`return Settings(decoded['themeColour'],`应该是['ThemeColour'],(大写T)`
    • 很高兴听到。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多