Как использовать переменную selectedDate (или любую другую переменную) из указанной области - PullRequest
0 голосов
/ 31 октября 2019

Это мой фрагмент кода:

  static DateTime chosenDate = DateTime.now();
  String formattedDate = DateFormat('yyyy-MM-dd – kk:mm').format(chosenDate);
  DateTime picked;
  Future<Null> _selectDate(BuildContext context) async {
    DateTime picked = await showDatePicker(
        context: context,
        initialDate: chosenDate,
        firstDate: DateTime(2015, 8),
        lastDate: DateTime(2101));
    if (picked != null && picked != chosenDate)
      setState(() {
        chosenDate = picked;
      });
  }

Как я могу гарантировать, что selectedDate может использоваться где-то еще, например, как действие, которое отображает selectedDate вне указанной области. Я объявил его в файле main.dart следующим образом DateTime chosenDate;, но когда я использую его на другом экране со следующими утверждениями, значение возвращается как нулевое с сообщением об ошибке, говорящим, что получатель 'year' не найдени, следовательно, возвращается ноль:

class _FinalPageState extends State<FinalPage> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text("$formattedDate"),
    );
  }
}

Где formattedDate равен String formattedDate = DateFormat('yyyy-MM-dd – kk:mm').format(chosenDate);

Также у кого-нибудь есть идеи, как сохранить это значение, чтобы при каждом перезапуске приложения оно не потерялось

1 Ответ

0 голосов
/ 31 октября 2019

Государственное управление, такое как Provider, может вам помочь. Посмотрите на это https://medium.com/flutter-community/flutter-pragmatic-state-management-using-provider-5c1129f9b5bb

, вы можете просто использовать функции get и set, которые определены в классе Provider, для получения или установки значений.

class DateSelector {
  BuildContext context;
  final state;

  DateSelector(this.context) : state = Provider.of<AppState>(context);

  Future<Null> _selectDate() async {
    if (...) {
      //you may need to change picked as the format you like
      state.setChosenDate(picked);
    }
  }

}


class AppState with ChangeNotifier {
   String _date;

  getChosenDate() => _date;

  setChosenDate(d) {
    _date = d;
    notifyListeners();
  }}


//make sure the root class should be like
void main() {
  runApp(new MyApp());}


class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<AppState>(
        builder: (_) => AppState(),
        child: MaterialApp(
            home: HomePage(),
            debugShowCheckedModeBanner: false));
  }
}

// затем просто вызовите метод get для доступа к нему с любого экрана, например.

@override
Widget build(BuildContext context) {
   appState = Provider.of<AppState>(context);
   ....
   ....
     Text(appState.getChosenDate())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...