флаттер будущее изменение значения, когда внутри будущего строителя

привет, я новичок в создании своего первого приложения, могу ли я изменить значение в будущей функции в построителе на основе изменения значения, а затем сбросить его так, как это было при завершении приложения? Archive.dart


class _ArchiveState extends State<Archive> {
  Future<List<YearsMain>> downloadJSONMain() async {
    String year;
    SharedPreferences pref = await SharedPreferences.getInstance();
    year = pref.getString('year');
    final jsonEndpoint = "http://msc-mu.com/api_verfication.php";

    final response = await http.post(jsonEndpoint, body: {
      'flag': 'selectmainsubjects',
      'year': year,
    });

    if (response.statusCode == 200) {
      List mainSubject = json.decode(response.body);
      return mainSubject.map((mains) => new YearsMain.fromJson(mains)).toList();
    } else
      throw Exception(
          'We were not able to successfully download the Main Subjects.');
  }
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: new FutureBuilder<List<YearsMain>>(
          future: downloadJSONMain(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              List<YearsMain> mains = snapshot.data;
              return ListViewMain(mains);
            } else if (snapshot.hasError) {
              return Text('${snapshot.error}');
            }
            return CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}

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


person Nada Khaled    schedule 10.10.2020    source источник


Ответы (1)


Вы можете использовать DropdownButton, чтобы разрешить пользователям изменять год. Но прежде перенесите свою будущую логику в initState. Используйте обратный вызов Dropdown onChanged, чтобы обновить экземпляр sharedPreferences и будущее внутри setState. Вот пример:

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  Future future;
  String selectedYear = "2020";

  @override
  void initState() {
    future = downloadJSONMain(); // or just set the "future" variable inside the "downloadJSONMain function
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return DropdownButton<String>(
      value: dropdownValue,
      icon: Icon(Icons.arrow_downward),
      iconSize: 24,
      elevation: 16,
      style: TextStyle(color: Colors.deepPurple),
      underline: Container(
        height: 2,
        color: Colors.deepPurpleAccent,
      ),
      onChanged: (String newValue) {
        setState(() {
          selectedYear = newValue;
          // update the future once user select a new year
          future = downloadJSONMain();
          // also save it to the sharedPrefeences here
          // ...

        });
      },
      items: <String>["2017", "2018", "2019", "2020"]
          .map<DropdownMenuItem<String>>((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
    );
  }
}
person oyrinkozhi    schedule 10.10.2020
comment
как я могу вернуться к исходному значению, когда приложение закрыто? - person Nada Khaled; 10.10.2020
comment
Вы имеете в виду значение по умолчанию под оригиналом? Если это так, он уже будет использовать значение по умолчанию, которое вы установили внутри состояния: String selectedYear = "2020". Если вы хотите использовать предыдущее значение, установленное пользователем, вы уже используете этот способ с этой строкой: year = pref.getString('year');. Как я показал в своем коде, вы должны сохранить его в настройках с помощью файла onChanged. - person oyrinkozhi; 10.10.2020
comment
могу я поговорить с вами о разладе? - person Nada Khaled; 10.10.2020
comment
есть значение, которое уже сохранено в общих настройках до того, как эта страница станет годом, есть ли способ вернуться к нему? после закрытия приложения? - person Nada Khaled; 10.10.2020