如何在 Flutter 中检查应用程序首次启动
How to check first time app launch in Flutter
我是flutter的初学者,我创建了我的应用程序,但我想检查用户是否在安装后第一次打开该应用程序,我看到了但不知道如何?
这是启动画面代码,代码在 3 秒后将用户直接移至主屏幕,但我想检查用户是否第一次打开应用程序并将用户移至欢迎屏幕,或者如果用户不是第一次并将用户移动到主屏幕。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:book_pen/main.dart';
import 'package:book_pen/Welcome.dart';
void main() {
runApp(new MaterialApp(
home: new SplashScreen(),
routes: <String, WidgetBuilder>{
'/HomePage': (BuildContext context) => new HomePage(),
'/WelcomePage': (BuildContext context) => new WelcomePage()
},
));
}
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => new _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
startTime() async {
var _duration = new Duration(seconds: 3);
return new Timer(_duration, navigationPageHome);
}
void navigationPageHome() {
Navigator.of(context).pushReplacementNamed('/HomePage');
}
void navigationPageWel() {
Navigator.of(context).pushReplacementNamed('/WelcomePage');
}
@override
void initState() {
super.initState();
startTime();
}
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
body: Stack(
children: <Widget>[
Center(
child: new Image.asset(
'assets/images/SplashBack.jpg',
width: size.width,
height: size.height,
fit: BoxFit.fill,
),
),
Center(
child: new Image.asset(
'assets/images/BigPurppleSecSh.png',
height: 150,
width: 300,
)),
],
),
);
}
}
您可以使用https://pub.dev/packages/shared_preferences在用户第一次输入时添加一个值
@Abdullrahman,请按照其他人的建议使用 shared_preferences
。这是你如何做到的,
- 依赖shared_preferences包在
pubspec.yaml
和运行 Packages get
:
dependencies:
flutter:
sdk: flutter
shared_preferences: ^0.5.4+6
- 导入包:
import 'package:shared_preferences/shared_preferences.dart';
- 实施它:
class _SplashScreenState extends State<SplashScreen> {
startTime() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool firstTime = prefs.getBool('first_time');
var _duration = new Duration(seconds: 3);
if (firstTime != null && !firstTime) {// Not first time
return new Timer(_duration, navigationPageHome);
} else {// First time
prefs.setBool('first_time', false);
return new Timer(_duration, navigationPageWel);
}
}
void navigationPageHome() {
Navigator.of(context).pushReplacementNamed('/HomePage');
}
void navigationPageWel() {
Navigator.of(context).pushReplacementNamed('/WelcomePage');
}
........
注意:如果用户清除缓存,SharedPreferences 数据将被删除。 SharePreferences 是一个本地选项。如果你想防止这种情况发生,你可以使用 firestore 来保存 bool 值,但 firestore 对于像这样的简单任务来说可能有点矫枉过正。
希望这对您有所帮助。
这里是代码,没有任何错误,说明得很好
class _SplashScreenState extends State<SplashScreen> {
Future<bool> isFirstTime() async {
var isFirstTime = SharedPref.pref.getBool('first_time');
if (isFirstTime != null && !isFirstTime) {
SharedPref.pref.setBool('first_time', false);
return false;
} else {
SharedPref.pref.setBool('first_time', false);
return true;
}
}
@override
void initState() {
super.initState();
Timer(Duration(seconds: 3), () {
isFirstTime().then((isFirstTime) {
isFirstTime ? print("First time") : print("Not first time");
});
}
);
}
}
使用is_first_run包就更简单了。你只需要做:
bool firstRun = await IsFirstRun.isFirstRun();
它returns true
如果应用程序是第一次启动。
我是flutter的初学者,我创建了我的应用程序,但我想检查用户是否在安装后第一次打开该应用程序,我看到了
这是启动画面代码,代码在 3 秒后将用户直接移至主屏幕,但我想检查用户是否第一次打开应用程序并将用户移至欢迎屏幕,或者如果用户不是第一次并将用户移动到主屏幕。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:book_pen/main.dart';
import 'package:book_pen/Welcome.dart';
void main() {
runApp(new MaterialApp(
home: new SplashScreen(),
routes: <String, WidgetBuilder>{
'/HomePage': (BuildContext context) => new HomePage(),
'/WelcomePage': (BuildContext context) => new WelcomePage()
},
));
}
class SplashScreen extends StatefulWidget {
@override
_SplashScreenState createState() => new _SplashScreenState();
}
class _SplashScreenState extends State<SplashScreen> {
startTime() async {
var _duration = new Duration(seconds: 3);
return new Timer(_duration, navigationPageHome);
}
void navigationPageHome() {
Navigator.of(context).pushReplacementNamed('/HomePage');
}
void navigationPageWel() {
Navigator.of(context).pushReplacementNamed('/WelcomePage');
}
@override
void initState() {
super.initState();
startTime();
}
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
return Scaffold(
body: Stack(
children: <Widget>[
Center(
child: new Image.asset(
'assets/images/SplashBack.jpg',
width: size.width,
height: size.height,
fit: BoxFit.fill,
),
),
Center(
child: new Image.asset(
'assets/images/BigPurppleSecSh.png',
height: 150,
width: 300,
)),
],
),
);
}
}
您可以使用https://pub.dev/packages/shared_preferences在用户第一次输入时添加一个值
@Abdullrahman,请按照其他人的建议使用 shared_preferences
。这是你如何做到的,
- 依赖shared_preferences包在
pubspec.yaml
和运行Packages get
:
dependencies:
flutter:
sdk: flutter
shared_preferences: ^0.5.4+6
- 导入包:
import 'package:shared_preferences/shared_preferences.dart';
- 实施它:
class _SplashScreenState extends State<SplashScreen> {
startTime() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
bool firstTime = prefs.getBool('first_time');
var _duration = new Duration(seconds: 3);
if (firstTime != null && !firstTime) {// Not first time
return new Timer(_duration, navigationPageHome);
} else {// First time
prefs.setBool('first_time', false);
return new Timer(_duration, navigationPageWel);
}
}
void navigationPageHome() {
Navigator.of(context).pushReplacementNamed('/HomePage');
}
void navigationPageWel() {
Navigator.of(context).pushReplacementNamed('/WelcomePage');
}
........
注意:如果用户清除缓存,SharedPreferences 数据将被删除。 SharePreferences 是一个本地选项。如果你想防止这种情况发生,你可以使用 firestore 来保存 bool 值,但 firestore 对于像这样的简单任务来说可能有点矫枉过正。
希望这对您有所帮助。
这里是代码,没有任何错误,说明得很好
class _SplashScreenState extends State<SplashScreen> {
Future<bool> isFirstTime() async {
var isFirstTime = SharedPref.pref.getBool('first_time');
if (isFirstTime != null && !isFirstTime) {
SharedPref.pref.setBool('first_time', false);
return false;
} else {
SharedPref.pref.setBool('first_time', false);
return true;
}
}
@override
void initState() {
super.initState();
Timer(Duration(seconds: 3), () {
isFirstTime().then((isFirstTime) {
isFirstTime ? print("First time") : print("Not first time");
});
}
);
}
}
使用is_first_run包就更简单了。你只需要做:
bool firstRun = await IsFirstRun.isFirstRun();
它returns true
如果应用程序是第一次启动。