Flutter / JSON: доступ к элементу экземпляра невозможен с использованием статического доступа

#json #flutter #dart #static-variables

#json #flutter #dart #статические переменные

Вопрос:

Вот полный фрагмент кода, который должен продемонстрировать проблему, с которой я столкнулся.

 import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:flutter/rendering.dart';
import 'package:flutter/services.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.landscapeLeft,
    DeviceOrientation.landscapeRight,
  ]);
  SystemChrome.setEnabledSystemUIOverlays([]);
  runApp(
    MaterialApp(
      home: MyHomePage(),
    ),
  );
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key,}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

Future<latestVersion> fetchAlbum() async {
  final response = await http.get('https://api.jsonbin.io/b/5fd25941bef8b7699e57dce9');
  if (response.statusCode == 200) {
    print('yay');
    return latestVersion.fromJson(jsonDecode(response.body));
  } else {
    print('nay');
    throw Exception('Failed to load version');
  }
}

class latestVersion {
  final String title;
  final String version;

  latestVersion({this.version, this.title});

  factory latestVersion.fromJson(Map<String, dynamic> json) {
    return latestVersion(version: json['version'], title: json['title'],
    );
  }
}

class _MyHomePageState extends State<MyHomePage> {
  static Future<latestVersion> futureAlbum;

  @override
  void initState() {
    super.initState();
    futureAlbum = fetchAlbum();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.yellow,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(''),
            Text('CURRENT'),
            Text('---------'),
            Text('0.37'),
            Text(''),
            Text('LATEST'),
            Text('--------'),
            Text(latestVersion.version),
            Text(''),
            Text(''),
          ],
        ),
      ),
    );
  }
}
 

При попытке запустить этот код я получаю сообщение об ошибке в строке 76.

 "instance member 'version' cannot be accessed using static access"
 

Как именно я могу получить доступ к этой json-декодированной переменной? Заранее благодарю вас. Я новичок в работе с асинхронными функциями и будущим и был бы признателен за любую помощь, которая может быть оказана.

Ответ №1:

Ошибка означает version , что это не статическая переменная. Поэтому, чтобы получить к нему такой доступ, LatestVersion.version либо создает version статическую переменную, либо

Заменить

 Text(LatestVersion.version),
 

с

 Text(LatestVersion().version),
 

Если в вашем коде все остальное правильно, то вышеприведенное должно сработать.

Комментарии:

1. Спасибо. Это абсолютно правильно. Теперь я сталкиваюсь с проблемой, что мое значение равно нулю. но это другая проблема, с которой мне нужно будет справиться самостоятельно. Большое вам спасибо за вашу помощь.