最近,我试图运行该项目,但似乎snackbar是有这样的某种错误
编译器在“上下文”消息下方显示错误
如何解决?
第一个
这里的完整的源代码的TopSnackBar
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:top_snackbar_flutter/safe_area_values.dart';
import 'package:top_snackbar_flutter/tap_bounce_container.dart';
typedef ControllerCallback = void Function(AnimationController);
enum DismissType { onTap, onSwipe, none }
OverlayEntry? _previousEntry;
/// The [overlayState] argument is used to add specific overlay state.
/// If you are sure that there is a overlay state in your [BuildContext],
/// You can get it [Overlay.of(BuildContext)]
/// Displays a widget that will be passed to [child] parameter above the current
/// contents of the app, with transition animation
///
/// The [child] argument is used to pass widget that you want to show
///
/// The [animationDuration] argument is used to specify duration of
/// enter transition
///
/// The [reverseAnimationDuration] argument is used to specify duration of
/// exit transition
///
/// The [displayDuration] argument is used to specify duration displaying
///
/// The [onTap] callback of [_TopSnackBar]
///
/// The [persistent] argument is used to make snack bar persistent, so
/// [displayDuration] will be ignored. Default is false.
///
/// The [onAnimationControllerInit] callback is called on internal
/// [AnimationController] has been initialized.
///
/// The [padding] argument is used to specify amount of outer padding
///
/// [curve] and [reverseCurve] arguments are used to specify curves
/// for in and out animations respectively
///
/// The [safeAreaValues] argument is used to specify the arguments of the
/// [SafeArea] widget that wrap the snackbar.
///
/// The [dismissType] argument specify which action to trigger to
/// dismiss the snackbar. Defaults to `TopSnackBarDismissType.onTap`
///
/// The [dismissDirection] argument specify in which direction the snackbar
/// can be dismissed. This argument is only used when [dismissType] is equal
/// to `DismissType.onSwipe`. Defaults to `[DismissDirection.up]`
void showTopSnackBar(
OverlayState overlayState,
Widget child, {
Duration animationDuration = const Duration(milliseconds: 1200),
Duration reverseAnimationDuration = const Duration(milliseconds: 550),
Duration displayDuration = const Duration(milliseconds: 3000),
VoidCallback? onTap,
bool persistent = false,
ControllerCallback? onAnimationControllerInit,
EdgeInsets padding = const EdgeInsets.all(16),
Curve curve = Curves.elasticOut,
Curve reverseCurve = Curves.linearToEaseOut,
SafeAreaValues safeAreaValues = const SafeAreaValues(),
DismissType dismissType = DismissType.onTap,
List<DismissDirection> dismissDirection = const [DismissDirection.up],
}) {
late OverlayEntry _overlayEntry;
_overlayEntry = OverlayEntry(
builder: (_) {
return _TopSnackBar(
onDismissed: () {
_overlayEntry.remove();
_previousEntry = null;
},
animationDuration: animationDuration,
reverseAnimationDuration: reverseAnimationDuration,
displayDuration: displayDuration,
onTap: onTap,
persistent: persistent,
onAnimationControllerInit: onAnimationControllerInit,
padding: padding,
curve: curve,
reverseCurve: reverseCurve,
safeAreaValues: safeAreaValues,
dismissType: dismissType,
dismissDirections: dismissDirection,
child: child,
);
},
);
if (_previousEntry != null && _previousEntry!.mounted) {
_previousEntry?.remove();
}
overlayState.insert(_overlayEntry);
_previousEntry = _overlayEntry;
}
/// Widget that controls all animations
class _TopSnackBar extends StatefulWidget {
const _TopSnackBar({
Key? key,
required this.child,
required this.onDismissed,
required this.animationDuration,
required this.reverseAnimationDuration,
required this.displayDuration,
required this.padding,
required this.curve,
required this.reverseCurve,
required this.safeAreaValues,
required this.dismissDirections,
this.onTap,
this.persistent = false,
this.onAnimationControllerInit,
this.dismissType = DismissType.onTap,
}) : super(key: key);
final Widget child;
final VoidCallback onDismissed;
final Duration animationDuration;
final Duration reverseAnimationDuration;
final Duration displayDuration;
final VoidCallback? onTap;
final ControllerCallback? onAnimationControllerInit;
final bool persistent;
final EdgeInsets padding;
final Curve curve;
final Curve reverseCurve;
final SafeAreaValues safeAreaValues;
final DismissType dismissType;
final List<DismissDirection> dismissDirections;
@override
_TopSnackBarState createState() => _TopSnackBarState();
}
class _TopSnackBarState extends State<_TopSnackBar>
with SingleTickerProviderStateMixin {
late final Animation<Offset> _offsetAnimation;
late final AnimationController _animationController;
Timer? _timer;
final _offsetTween = Tween(begin: const Offset(0, -1), end: Offset.zero);
@override
void initState() {
_animationController = AnimationController(
vsync: this,
duration: widget.animationDuration,
reverseDuration: widget.reverseAnimationDuration,
);
_animationController.addStatusListener(
(status) {
if (status == AnimationStatus.completed && !widget.persistent) {
_timer = Timer(widget.displayDuration, () {
if (mounted) {
_animationController.reverse();
}
});
}
if (status == AnimationStatus.dismissed) {
_timer?.cancel();
widget.onDismissed.call();
}
},
);
widget.onAnimationControllerInit?.call(_animationController);
_offsetAnimation = _offsetTween.animate(
CurvedAnimation(
parent: _animationController,
curve: widget.curve,
reverseCurve: widget.reverseCurve,
),
);
if (mounted) {
_animationController.forward();
}
super.initState();
}
@override
void dispose() {
_animationController.dispose();
_timer?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Positioned(
top: widget.padding.top,
left: widget.padding.left,
right: widget.padding.right,
child: SlideTransition(
position: _offsetAnimation,
child: SafeArea(
top: widget.safeAreaValues.top,
bottom: widget.safeAreaValues.bottom,
left: widget.safeAreaValues.left,
right: widget.safeAreaValues.right,
minimum: widget.safeAreaValues.minimum,
maintainBottomViewPadding:
widget.safeAreaValues.maintainBottomViewPadding,
child: _buildDismissibleChild(),
),
),
);
}
/// Build different type of [Widget] depending on [DismissType] value
Widget _buildDismissibleChild() {
switch (widget.dismissType) {
case DismissType.onTap:
return TapBounceContainer(
onTap: () {
widget.onTap?.call();
if (!widget.persistent && mounted) {
_animationController.reverse();
}
},
child: widget.child,
);
case DismissType.onSwipe:
var childWidget = widget.child;
for (final direction in widget.dismissDirections) {
childWidget = Dismissible(
direction: direction,
key: UniqueKey(),
dismissThresholds: const {DismissDirection.up: 0.2},
confirmDismiss: (direction) async {
if (!widget.persistent && mounted) {
if (direction == DismissDirection.down) {
await _animationController.reverse();
} else {
_animationController.reset();
}
}
return false;
},
child: childWidget,
);
}
return childWidget;
case DismissType.none:
return widget.child;
}
}
}
我已经尝试在“上下文”行旁边添加一些“此”行,但仍然不起作用
我最近编辑这篇文章的一些评论要求,我显示一些职位的showtopsnackbar和一些错误消息,我得到了。
我希望这能成为解决我所有错误的方法或参考
1条答案
按热度按时间hgtggwj01#
如示例页面所示,您需要如下传递
Overlay
:软件包已更新,但他们没有更新自述文件页面。