【问题标题】:Flutter check the date every time an app loads每次应用加载时 Flutter 检查日期
【发布时间】:2019-12-12 09:43:03
【问题描述】:

我是 Flutter 的新手,我正在构建一个真正依赖于日期的 Flutter 应用程序。基本上,我希望加载的内容在当天保持不变,然后在用户第二天打开应用程序时更新,即使他们在距午夜 5 分钟关闭应用程序也是如此。

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

现在,我正在使用 Shared Preferences 来保存日期并再次检查它,但我不确定如何确保每次运行应用程序时都检查它。

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 dart


    【解决方案1】:

    欢迎使用 Flutter :D

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

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

    【讨论】:

    • 谢谢,太好了。这真的帮助我理解了。
    • 谢谢!之后是否需要在 HomeState 的生命周期回调之一中删除观察者?
    • 嗯?,不,我认为您不需要删除它。
    • @ShadyBoshra 多页应用程序怎么样?将这个放在顶级小部件上就足够了吗?
    • @anoop4real,我认为您可以为此使用 Provider 或任何其他状态管理方式。
    【解决方案2】:

    听起来像以前提供的答案会对您有所帮助:

    Listen to Lifecyle events

    【讨论】:

      猜你喜欢
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多