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.
 
 
 
 
 
 

244 lines
7.8 KiB

import 'package:flare_flutter/flare_controls.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'
hide RefreshIndicator, RefreshIndicatorState;
import 'package:flutter/services.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:huixiang/generated/l10n.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:rive/rive.dart';
class MyHeader extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MyClassicHeader(
refreshStyle: RefreshStyle.Follow,
completeText: S.of(context).shuaxinchenggong,
failedText: S.of(context).shuaxinshibai,
refreshingText: S.of(context).shuaxinzhong,
releaseText: S.of(context).shifangshuaxin,
idleText: S.of(context).xialashuaxin,
iconPos: IconPosition.left,
completeTextStyle: TextStyle(
color: Color(0xFF32A060),
),
completeIcon: Icon(
Icons.done,
color: Color(0xFF32A060),
),
refreshingIcon: SpinKitCircle(
color: Colors.grey,
size: 24.w,
),
);
}
}
class CustomHeader extends RefreshIndicator {
@override
State<StatefulWidget> createState() {
return _CustomHeader();
}
}
class _CustomHeader extends RefreshIndicatorState<CustomHeader> {
FlareControls flareController = FlareControls();
Artboard _riveArtboard;
RiveAnimationController _controllerIdle;
@override
void initState() {
super.initState();
// rootBundle.load("assets/riv/finger_tapping.riv").then((value) async {
rootBundle.load("assets/riv/runner_boy.riv").then((value) async {
final riveFile = RiveFile();
riveFile.import(value);
final artboard = riveFile.mainArtboard;
artboard.addController(_controllerIdle = SimpleAnimation("Animation"));
// artboard.addController(_controllerIdle = SimpleAnimation("Idle_1"));
setState(() {
_riveArtboard = artboard;
});
});
}
@override
Widget buildContent(BuildContext context, RefreshStatus mode) {
if (_controllerIdle != null) {
if (mode == RefreshStatus.idle) {
_controllerIdle.isActive = false;
} else {
_controllerIdle.isActive = true;
}
}
return Container(
height: 50,
child: Rive(
artboard: _riveArtboard,
alignment: Alignment.center,
fit: BoxFit.contain,
),
);
}
}
class MyClassicHeader extends RefreshIndicator {
final OuterBuilder outerBuilder;
final String releaseText,
idleText,
refreshingText,
completeText,
failedText,
canTwoLevelText;
final Widget releaseIcon,
idleIcon,
refreshingIcon,
completeIcon,
failedIcon,
canTwoLevelIcon,
twoLevelView;
/// icon and text middle margin
final double spacing;
final IconPosition iconPos;
final TextStyle textStyle;
final TextStyle completeTextStyle;
const MyClassicHeader({
Key key,
RefreshStyle refreshStyle: RefreshStyle.Follow,
double height: 60.0,
Duration completeDuration: const Duration(milliseconds: 600),
this.outerBuilder,
this.textStyle: const TextStyle(color: Colors.grey),
this.completeTextStyle: const TextStyle(color: Colors.grey),
this.releaseText,
this.refreshingText,
this.canTwoLevelIcon,
this.twoLevelView,
this.canTwoLevelText,
this.completeText,
this.failedText,
this.idleText,
this.iconPos: IconPosition.left,
this.spacing: 15.0,
this.refreshingIcon,
this.failedIcon: const Icon(Icons.error, color: Colors.grey),
this.completeIcon: const Icon(Icons.done, color: Colors.grey),
this.idleIcon = const Icon(Icons.arrow_downward, color: Colors.grey),
this.releaseIcon = const Icon(Icons.refresh, color: Colors.grey),
}) : super(
key: key,
refreshStyle: refreshStyle,
completeDuration: completeDuration,
height: height,
);
@override
State createState() {
return _ClassicHeaderState();
}
}
class _ClassicHeaderState extends RefreshIndicatorState<MyClassicHeader> {
Widget _buildText(mode) {
RefreshString strings =
RefreshLocalizations.of(context)?.currentLocalization ??
EnRefreshString();
return Text(
mode == RefreshStatus.canRefresh
? widget.releaseText ?? strings.canRefreshText
: mode == RefreshStatus.completed
? widget.completeText ?? strings.refreshCompleteText
: mode == RefreshStatus.failed
? widget.failedText ?? strings.refreshFailedText
: mode == RefreshStatus.refreshing
? widget.refreshingText ?? strings.refreshingText
: mode == RefreshStatus.idle
? widget.idleText ?? strings.idleRefreshText
: mode == RefreshStatus.canTwoLevel
? widget.canTwoLevelText ??
strings.canTwoLevelText
: "",
style: mode == RefreshStatus.completed
? widget.completeTextStyle
: widget.textStyle);
}
Widget _buildIcon(mode) {
Widget icon = mode == RefreshStatus.canRefresh
? widget.releaseIcon
: mode == RefreshStatus.idle
? widget.idleIcon
: mode == RefreshStatus.completed
? widget.completeIcon
: mode == RefreshStatus.failed
? widget.failedIcon
: mode == RefreshStatus.canTwoLevel
? widget.canTwoLevelIcon
: mode == RefreshStatus.canTwoLevel
? widget.canTwoLevelIcon
: mode == RefreshStatus.refreshing
? widget.refreshingIcon ??
SizedBox(
width: 25.0,
height: 25.0,
child: defaultTargetPlatform ==
TargetPlatform.iOS
? const CupertinoActivityIndicator()
: const CircularProgressIndicator(
strokeWidth: 2.0),
)
: widget.twoLevelView;
return icon ?? Container();
}
@override
bool needReverseAll() {
return false;
}
@override
Widget buildContent(BuildContext context, RefreshStatus mode) {
Widget textWidget = _buildText(mode);
Widget iconWidget = _buildIcon(mode);
List<Widget> children = <Widget>[
iconWidget,
SizedBox(
width: 10,
),
textWidget
];
final Widget container = Row(
// spacing: widget.spacing,
// textDirection: widget.iconPos == IconPosition.left
// ? TextDirection.ltr
// : TextDirection.rtl,
// direction: widget.iconPos == IconPosition.bottom ||
// widget.iconPos == IconPosition.top
// ? Axis.vertical
// : Axis.horizontal,
// crossAxisAlignment: WrapCrossAlignment.center,
// verticalDirection: widget.iconPos == IconPosition.bottom
// ? VerticalDirection.up
// : VerticalDirection.down,
// alignment: WrapAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: children,
);
return widget.outerBuilder != null
? widget.outerBuilder(container)
: Container(
child: Center(child: container),
height: widget.height,
);
}
}