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

kel*_*ikh 3 dart 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
         }

     }


  }
Run Code Online (Sandbox Code Playgroud)

Sha*_*hra 6

欢迎来到颤振:D

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

NP:我认为你不需要使用shared_preferencespackage。

这是一个 Dart 页面应用程序的代码。您只需将其复制到新的 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),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)