You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* ====================================================
* package : pages.welcome
* author : Created by nansi.
* time : 2019/5/5 4:47 PM
* remark :
* ====================================================
*/
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:power_logger/power_logger.dart';
import 'package:raw_toast/raw_toast.dart';
import 'package:recook/base/base_store_state.dart';
import 'package:recook/constants/constants.dart';
import 'package:recook/constants/header.dart';
import 'package:recook/pages/welcome/launch_privacy_dialog.dart';
import 'package:recook/utils/app_router.dart';
import 'package:recook/utils/storage/hive_store.dart';
import 'package:sprintf/sprintf.dart';
class LaunchWidget extends StatefulWidget {
@override
_LaunchWidgetState createState() => _LaunchWidgetState();
}
class _LaunchWidgetState extends BaseStoreState<LaunchWidget>
with SingleTickerProviderStateMixin {
Map<int, Image> _imageMap = {};
// GifController _gifController;
@override
void dispose() {
super.dispose();
}
@override
void initState() {
// _gifController = GifController(vsync: this);
super.initState();
//0-59
for (var i = 0; i <= 104; i++) {
_imageMap.putIfAbsent(i, () {
return Image.asset(
"assets/recook_launch_image/recook_launch_image_$i.png");
});
}
WidgetsBinding.instance.addPostFrameCallback((callback) async {
// _gifController.repeat(min: 0, max:59, period: Duration(milliseconds: 1500));
await Future.delayed(Duration(milliseconds: 2000));
PowerLogger.init(context, debug: AppConfig.debug);
if (HiveStore.appBox.get('privacy_init') == null) {
// if (true) {
bool agreeResult = (await launchPrivacyDialog(context)) ?? false;
if (!agreeResult) {
//第1次不同意
bool secondAgree =
(await launchPrivacySecondDialog(context)) ?? false;
//第2次不同意
if (!secondAgree)
SystemNavigator.pop();
else
HiveStore.appBox.put('privacy_init', true);
} else
HiveStore.appBox.put('privacy_init', true);
}
AppRouter.fadeAndReplaced(globalContext, RouteName.WELCOME_PAGE);
});
}
@override
Widget buildContext(BuildContext context, {store}) {
Constants.initial(context);
double width = MediaQuery.of(context).size.width;
double height = MediaQuery.of(context).size.height;
return Scaffold(
body: Container(
child: ImagesAnimation(
w: width,
h: height,
milliseconds: 2000,
entry: ImagesAnimationEntry(0, 70,
"assets/recook_launch_image/recook_launch_image_%s.png")),
),
);
}
}
class ImagesAnimation extends StatefulWidget {
final double w;
final double h;
final ImagesAnimationEntry entry;
final int milliseconds;
ImagesAnimation(
{Key key, this.w: 80, this.h: 80, this.entry, this.milliseconds: 1000})
: super(key: key);
@override
_InState createState() {
return _InState();
}
}
class _InState extends State<ImagesAnimation> with TickerProviderStateMixin {
AnimationController _controller;
Animation<int> _animation;
@override
void initState() {
super.initState();
_controller = new AnimationController(
vsync: this, duration: Duration(milliseconds: widget.milliseconds));
_animation =
new IntTween(begin: widget.entry.lowIndex, end: widget.entry.highIndex)
.animate(_controller)
..addListener(() {
setState(() {});
});
_controller.forward();
//widget.entry.lowIndex 表示从第几下标开始如0widget.entry.highIndex表示最大下标如7
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return new AnimatedBuilder(
animation: _animation,
builder: (BuildContext context, Widget child) {
String frame = _animation.value.toString();
return new Image.asset(
sprintf(widget.entry.basePath, [frame]), //根据传进来的参数拼接路径
gaplessPlayback: true, //避免图片闪烁
width: widget.w,
height: widget.h,
);
},
);
}
}
class ImagesAnimationEntry {
int lowIndex = 0;
int highIndex = 0;
String basePath;
ImagesAnimationEntry(this.lowIndex, this.highIndex, this.basePath);
}