首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在上述作用域之外使用变量chosenDate(或任何相关变量

如何在上述作用域之外使用变量chosenDate(或任何相关变量
EN

Stack Overflow用户
提问于 2019-10-31 18:27:55
回答 1查看 34关注 0票数 0

这是我的代码片段:

代码语言:javascript
复制
  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;
      });
  }

如何确保chosenDate可以在其他地方使用,比如在上述作用域之外显示chosenDate的活动。我已经在main.dart文件中将其声明为以下DateTime chosenDate;,但是当我在另一个屏幕上使用以下语句时,该值返回为null,并显示错误消息,指出找不到getter 'year‘,因此返回null:

代码语言:javascript
复制
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);

另外,有没有人知道如何保存这个值,这样每次重启应用程序时,它都不会丢失?

EN

Stack Overflow用户

回答已采纳

发布于 2019-10-31 18:37:24

Provider等状态管理可能会对您有所帮助。看看这个https://medium.com/flutter-community/flutter-pragmatic-state-management-using-provider-5c1129f9b5bb

您可以简单地使用Provider类中定义的getset函数来获取或设置这些值。

代码语言:javascript
复制
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方法就可以从任何屏幕访问它,例如。

代码语言:javascript
复制
@override
Widget build(BuildContext context) {
   appState = Provider.of<AppState>(context);
   ....
   ....
     Text(appState.getChosenDate())
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58641338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档