Flutter 每次加载应用程序时检查日期

Flutter 每次加载应用程序时检查日期,flutter,dart,Flutter,Dart,我是一个新的颤振和建设颤振应用程序,这真的取决于日期。基本上,我希望加载的内容当天保持不变,然后在用户第二天打开应用程序时更新,即使他们在午夜前5分钟关闭应用程序 我注意到initState只被调用一次。如果用户打开颤振应用程序,然后关闭,则再次打开的应用程序将显示相同的内容。我想确保如果用户打开应用程序并且它恰好是未来的日期,状态会更新,但如果它仍然是当前日期,则保持不变 现在,我正在使用共享首选项保存日期并再次检查,但我不知道如何确保每次应用程序运行时都检查它 import 'package

我是一个新的颤振和建设颤振应用程序,这真的取决于日期。基本上,我希望加载的内容当天保持不变,然后在用户第二天打开应用程序时更新,即使他们在午夜前5分钟关闭应用程序

我注意到initState只被调用一次。如果用户打开颤振应用程序,然后关闭,则再次打开的应用程序将显示相同的内容。我想确保如果用户打开应用程序并且它恰好是未来的日期,状态会更新,但如果它仍然是当前日期,则保持不变

现在,我正在使用共享首选项保存日期并再次检查,但我不知道如何确保每次应用程序运行时都检查它

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


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


  class _HomePage extends State<HomePage> {
  String _todaysDate;
  String _yesterdayDate;
  final now = DateTime.now();

    @override
      void initState(){
      super.initState();

        _setupDateDisplay().then((_todaysDate){
       _checkDate(_todaysDate);
      });
    }

    Future<String> _setupDateDisplay() async {

      _todaysDate = DateFormat.yMMMMd("en_US").format(now);

      return _todaysDate;

    }

     _checkDate(String _todaysDate) async{
         sharedPreferences = await SharedPreferences.getInstance();
         String _yesterdayDate = sharedPreferences.getString('lastDate') ?? '';

         if (_todaysDate != _yesterdayDate){
            //SHOW NEW CONTENT
            sharedPreferences.setString('lastDate', _todaysDate);
         }else{
           //SHOW SAME CONTENT
         }

     }


  }
导入“包装:颤振/材料.省道”;
导入“包:intl/intl.dart”;
导入“dart:async”;
导入“package:shared_preferences/shared_preferences.dart”;
类主页扩展了StatefulWidget{
@凌驾
_主页createState()=>\u主页();
}
类(扩展状态){
字符串(今日);;
字符串_昨日日期;
final now=DateTime.now();
@凌驾
void initState(){
super.initState();
_setupDateDisplay()。然后(_todaysDate){
_支票日期(今日);
});
}
Future\u setupDateDisplay()异步{
_todaysDate=DateFormat.yMMMMd(“en_US”).format(现在);
今日返回;
}
_checkDate(字符串_todaysDate)异步{
SharedReferences=等待SharedReferences.getInstance();
字符串_yesterdayDate=SharedReferences.getString('lastDate')??“”;
如果(今天!=\u昨天){
//显示新内容
SharedReferences.setString('lastDate',_todaysDate);
}否则{
//显示相同的内容
}
}
}

听起来,前面提供的答案将帮助您:


听起来,前面提供的答案将帮助您:

欢迎来到颤振:D

这是我为你准备的演示应用程序,它可以按照你的要求工作。它使用LifecycleEventHandler扩展自WidgetsBindingObserver类,该类可以观察应用程序和小部件的状态

NP:我认为您不需要使用
共享的\u首选项

下面是一个dart页面应用程序的代码。你们只需要将它复制到新的颤振项目中,然后自己看看这个应用程序。希望能有所帮助

解释代码,非常简单,每次应用程序恢复时,它都会检查现在的日期,并为日期选择适当的内容

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class LifecycleEventHandler extends WidgetsBindingObserver {
  final AsyncCallback resumeCallBack;

  LifecycleEventHandler({this.resumeCallBack});

  @override
  Future<Null> didChangeAppLifecycleState(AppLifecycleState state) async {
    switch (state) {
      case AppLifecycleState.inactive:
      case AppLifecycleState.paused:
      case AppLifecycleState.suspending:
      case AppLifecycleState.resumed:
        await resumeCallBack();
        break;
    }
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Checking Date App Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Checking Date App'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {

  String _content = "";

  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addObserver(
        new LifecycleEventHandler(resumeCallBack: () async => _refreshContent()));
  }

  void _refreshContent() {
    setState(() {
      // Here you can change your widget
      // each time the app resumed.
      var now = DateTime.now();

      // Today
      if (new DateTime(now.year, now.month, now.day) == new DateTime(2019, 8, 4)) {
        _content = "Happy Birthday :D";
      } 
      // Tomorrow
      else if (new DateTime(now.year, now.month, now.day) == new DateTime(2019, 8, 5)) {
        _content = "It passed ONE day for your birthday ;)";
      } 
      // After Tomorrow
      else if (new DateTime(now.year, now.month, now.day) == new DateTime(2019, 8, 6)) {
        _content = "Did your dreams come true ??";
      } 
      // Unknown date
      else {
        _content = "Sorry, this day is not allowed. :(";
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _content,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _refreshContent,
        tooltip: 'Refresh',
        child: Icon(Icons.refresh),
      ),
    );
  }
}
导入“包:flift/foundation.dart”;
进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类LifecycleEventHandler扩展了WidgetsBindingObserver{
最终异步回调恢复回调;
LifecycleEventHandler({this.resumeCallBack});
@凌驾
Future didChangeAppLifecycleState(AppLifecycleState状态)异步{
开关(状态){
案例AppLifecycleState.inactive:
案例AppLifecycleState.paused:
案例AppLifecycleState.suspending:
案例AppLifecycleState.resumed:
等待恢复回调();
打破
}
}
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“检查日期应用程序演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:我的主页(标题:“检查日期应用程序”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
字符串_content=“”;
@凌驾
void initState(){
super.initState();
WidgetsBinding.instance.addObserver(
新的LifecycleEventHandler(resumeCallBack:()异步=>\u刷新内容());
}
void _refreshContent(){
设置状态(){
//在这里您可以更改您的小部件
//每次应用程序恢复时。
var now=DateTime.now();
//今天
if(新日期时间(now.year,now.month,now.day)=新日期时间(2019,8,4)){
_content=“生日快乐:D”;
} 
//明天
else if(新日期时间(now.year,now.month,now.day)=新日期时间(2019,8,5)){
_content=“你过了一天生日;)”;
} 
//明天以后
else if(新日期时间(now.year,now.month,now.day)=新日期时间(2019,8,6)){
_content=“你的梦想成真了吗?”;
} 
//未知日期
否则{
_content=“对不起,这一天是不允许的。:”;
}
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
正文(
_内容,,
),
],
),
),
浮动操作按钮:浮动操作按钮(
onPressed:\u刷新内容,
工具提示:“刷新”,
子:图标(Icons.refresh),
),
);
}
}
欢迎来到颤振:D

这是我为你准备的演示应用程序,它可以按照你的要求工作。它使用LifecycleEventHandler扩展自WidgetsBindingObserver类,该类可以观察应用程序和小部件的状态

NP:我认为您不需要使用
共享的\u首选项

下面是一个dart页面应用程序的代码。你们只需要将它复制到新的颤振项目中,然后自己看看这个应用程序。希望能有所帮助

解释代码,非常简单,每次应用程序恢复时,它都会检查现在的日期,并为日期选择适当的内容

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class LifecycleEventHandler extends WidgetsBindingObserver {
  final AsyncCallback resumeCallBack;

  LifecycleEventHandler({this.resumeCallBack});

  @override
  Future<Null> didChangeAppLifecycleState(AppLifecycleState state) async {
    switch (state) {
      case AppLifecycleState.inactive:
      case AppLifecycleState.paused:
      case AppLifecycleState.suspending:
      case AppLifecycleState.resumed:
        await resumeCallBack();
        break;
    }
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Checking Date App Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Checking Date App'),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {

  String _content = "";

  @override
  void initState() {
    super.initState();

    WidgetsBinding.instance.addObserver(
        new LifecycleEventHandler(resumeCallBack: () async => _refreshContent()));
  }

  void _refreshContent() {
    setState(() {
      // Here you can change your widget
      // each time the app resumed.
      var now = DateTime.now();

      // Today
      if (new DateTime(now.year, now.month, now.day) == new DateTime(2019, 8, 4)) {
        _content = "Happy Birthday :D";
      } 
      // Tomorrow
      else if (new DateTime(now.year, now.month, now.day) == new DateTime(2019, 8, 5)) {
        _content = "It passed ONE day for your birthday ;)";
      } 
      // After Tomorrow
      else if (new DateTime(now.year, now.month, now.day) == new DateTime(2019, 8, 6)) {
        _content = "Did your dreams come true ??";
      } 
      // Unknown date
      else {
        _content = "Sorry, this day is not allowed. :(";
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              _content,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _refreshContent,
        tooltip: 'Refresh',
        child: Icon(Icons.refresh),
      ),
    );
  }
}
导入“包:flift/foundation.dart”;
进口“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
Lif类