我是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] 删除。
我来说两句