Solved
主要问题是“withAnimation”方法的返回类型。它必须与您的自定义小部件类型相同。
所以:
class MiniBanner extends StatefulWidget implements MaterialBanner {
const MiniBanner({
Key key,
this.content = const SizedBox(),
this.contentTextStyle,
this.actions = const [SizedBox()],
this.elevation = 0,
this.leading,
this.backgroundColor = Colors.red, //custom default color
this.padding = EdgeInsets.zero,
this.leadingPadding = EdgeInsets.zero,
this.forceActionsBelow = false,
this.overflowAlignment = OverflowBarAlignment.end,
this.animation,
this.onVisible,
}) : assert(elevation == null || elevation >= 0.0),
assert(content != null),
assert(actions != null),
assert(forceActionsBelow != null),
super(key: key);
@override
final List<Widget> actions;
@override
final Animation<double> animation;
@override
final Color backgroundColor;
@override
final Widget content;
@override
final TextStyle contentTextStyle;
@override
final double elevation;
@override
final bool forceActionsBelow;
@override
final Widget leading;
@override
final EdgeInsetsGeometry leadingPadding;
@override
final VoidCallback onVisible;
@override
final OverflowBarAlignment overflowAlignment;
@override
final EdgeInsetsGeometry padding;
@override
MiniBanner withAnimation(Animation<double> newAnimation, {Key fallbackKey}) {
return MiniBanner(
key: key ?? fallbackKey,
content: content,
contentTextStyle: contentTextStyle,
actions: actions,
elevation: elevation,
leading: leading,
backgroundColor: backgroundColor,
padding: padding,
leadingPadding: leadingPadding,
forceActionsBelow: forceActionsBelow,
overflowAlignment: overflowAlignment,
animation: newAnimation,
onVisible: onVisible,
);
}
@override
State<MiniBanner> createState() => MiniBannerState();
}
class MiniBannerState extends State<MiniBanner> {
@override
Widget build(BuildContext context) {
// Now our MiniBanner correctly build this method
return Container(
color: widget.backgroundColor,
height: 10,
);
}
}
重要的提示
此代码不是空声音安全,因此如果您的 Flutter 应用程序启用了空声音安全,则必须更改一些语法,例如添加 ?在可为空的属性之后等等。
UPDATE
如果您想真正模拟原始 MaterialBanner 的所有动画,您必须复制几乎整个原始“构建”方法。
然后,要自定义您的小部件,您只需编辑materialBanner
变量,示例:
// other parts of code copied from original build method above
Widget materialBanner = Container(
color: widget.backgroundColor,
height: 10,
);
// other parts of code copied from original build method below