每次应用加载时Flutter都会检查日期

凯尔谢克

我是Flutter的新手,他正在构建一个Flutter应用程序,该应用程序确实取决于日期。基本上,我希望加载的内容在当天保持不变,然后在用户第二天打开应用程序时进行更新,即使他们在午夜5分钟之内退出应用程序也是如此。

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

现在,我正在使用“共享首选项”来保存日期并再次检查日期,但是我不确定每次应用程序运行时如何确保已对其进行检查。

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
         }

     }


  }
阴暗的博什拉

欢迎来到Flutter:D

这是我的演示应用程序,可以根据需要运行。它使用WidgetsBindingObserver扩展的LifecycleEventHandler,它可以观察应用程序和小部件的状态。

NP:我认为您不需要使用shared_preferences软件包。

这是一个飞镖页面应用程序的代码。您只需要将其复制到新的Flutter项目中,然后亲自查看应用即可。希望对您有所帮助。

说明代码,这非常简单,每次应用恢复时,它都会检查NOW的日期,并为该日期选择适当的内容。

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),
      ),
    );
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

每次加载时我的应用程序都会停止

每次切换屏幕时,Flutter Webview都会重新加载

每次我检查FacebookDialog.canPresentShareDialog时,应用程序都会冻结

每次我重新启动应用程序时,Flutter都会加载应用程序的旧版本

为什么 Ubuntu 在每次重启时都会开始文件检查?

django每次单击页面时都会重新加载变量

每次重新加载时Laravel地穴值都会更改

Firefox在每次加载页面时都会添加随机脚本

每次加载文档时都会执行单击功能

PHP SESSID在每次页面加载时都会重置

每次组件加载时,订阅代码都会逐步触发

每次页面加载时都会显示导航栏组件

我每次使用UPDATE时,日期,时间都会重置

每次应用启动时 FirebaseRecyclerAdapter 都会崩溃

Chrome打包的应用:每次重新加载时都必须打开检查器

每次加载Tableview单元格时,都会重新加载多个表单元格

每次加载组件时都会重新加载Angular 4+ Function

每次重新启动应用程序时,Spring Integration都会加载文件

Rails应用程序上的Highcharts每次加载都会渲染两次

应用程序在每次重启时都会导致AOT(优化应用程序)

每次点按应用图标时,iOS 13应用都会请求一个新场景

每次我运行任何应用程序时,Flutter 都会给我错误

每次我运行 flutter 应用程序时计算机都会死机

为什么每次使用javacc工具解析赋值语句时语法检查都会失败?

当我向下或向上滚动时,检查位置每次都会改变

每次加载页面时都会执行所有相关的计算吗?

每次执行“方案大纲”的值时,浏览器都会再次加载

每次页面加载时都会调用该指令,为什么呢?

动态创建的文本框编号在每次加载页面时都会增加