gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:09:03 26 4
gpt4 key购买 nike

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

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

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

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

这是我为您准备的演示应用程序,它应该可以如您所愿地运行。它使用LifecycleEventHandler扩展自WidgetsBindingObserver类,可以观察应用程序和widget的状态。

NP: I think you don't need to use shared_preferences package.

这是一个 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),
),
);
}
}

关于Flutter 会在每次应用加载时检查日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57348897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com