日期更改时如何刷新应用状态?

时间:2019-08-31 12:58:03

标签: flutter dart

我有一个非常依赖日期的应用程序。我想确保应用程序刷新并在新的一天是最新的。我一直在使用WidgetsBindingObserver类,但是不确定是否做错了什么。

基本上,如果用户在8月20日访问了该应用程序,将其关闭或将其手机/平板电脑置于睡眠状态。然后在8月21日回来,该应用程序没有刷新,并且我在应用程序中拥有的日期文本也没有刷新到新日期。在新的一天重新唤醒应用程序时,以下代码似乎并未更改日期文本。任何帮助将不胜感激。

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:async';
import 'dart:convert';
import 'package:flutter/widgets.dart';


class HomePage extends StatefulWidget {
  @override
  _HomePage createState() => _HomePage();
  }

class _HomePage extends State<HomePage> with WidgetsBindingObserver {
  String _formattedDate;
  String _formattedDay;
  final now = DateTime.now();
  SharedPreferences sharedPreferences;

  @override
  void initState(){
      super.initState();
      _setupDateDisplay().then((_formattedDate){

      });

      WidgetsBinding.instance.addObserver(this);
  }

    Widget build(BuildContext context) {
      return new Scaffold(
          backgroundColor: Color(0xfffde8d3).withOpacity(0.5),
          body: Center(
            child: Text('$_formattedDate ($_formattedDay)',style: TextStyle(color: Color(0xffffffff), fontSize: 16.0)),
          ),
        );
      }

  @override
  void didChangeAppLifecycleState(final AppLifecycleState state) {
    switch(state) {
      case AppLifecycleState.resumed:
        print("APP STATE RESUMED");
        setState(() {
          _refreshContent();
        });
        break;
      case AppLifecycleState.inactive:
        print("APP STATE INACTIVE");
        break;
      case AppLifecycleState.paused:
        print("APP STATE PAUSED");
        break;
      case AppLifecycleState.suspending:
        print("APP STATE SUSPENDING");
        break;
    }
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    print("APP IS DISPOSING");
    super.dispose();
  }

  void _refreshContent() {
      _setupDateDisplay().then((_formattedDate){

      });
  }

    Future<String> _setupDateDisplay() async {
      _formattedDate = DateFormat.yMMMMd("en_US").format(now);
      _formattedDay = DateFormat.EEEE("en_US").format(now);
      setState(() {
        _formattedDate = DateFormat.yMMMMd("en_US").format(now);
        _formattedDay = DateFormat.EEEE("en_US").format(now);
      });
      return _formattedDate;
    }

}

1 个答案:

答案 0 :(得分:1)

之所以会这样,是因为您将DateTime.now()存储在全局变量中。结果,每次使用now时,它将具有相同的值,即创建状态的日期。

相反,将now设为局部变量,以便每次调用该方法时都将其实例化:

Future<String> _setupDateDisplay() async {
  final now = DateTime.now();

  _formattedDate = DateFormat.yMMMMd("en_US").format(now);
  _formattedDay = DateFormat.EEEE("en_US").format(now);
  setState(() {
    _formattedDate = DateFormat.yMMMMd("en_US").format(now);
    _formattedDay = DateFormat.EEEE("en_US").format(now);
  });
  return _formattedDate;
}