Flutter hace un menú de Facebook simple
En Flutterestoy tratando de hacer un Facebookmenú simple , en la captura de pantalla de abajo tenemos el widget número uno y cuando hago clic en eso, el widget que está debajo del widget actual, debe cambiar de tamaño y crecer y mostrar otros íconos en ese
este código a continuación que introduje funciona bien, pero no tiene contenedor de fondo
en referencia al enlace Columnutilizado y lo cambié Stacky no funciona correctamente
referencia
import 'package:flutter/material.dart';
class FancyFab extends StatefulWidget {
final Function() onPressed;
final String tooltip;
final IconData icon;
FancyFab({this.onPressed, this.tooltip, this.icon});
@override
_FancyFabState createState() => _FancyFabState();
}
class _FancyFabState extends State<FancyFab>
with SingleTickerProviderStateMixin {
bool isOpened = false;
AnimationController _animationController;
Animation<Color> _buttonColor;
Animation<double> _animateIcon;
Animation<double> _translateButton;
Curve _curve = Curves.easeOut;
double _fabHeight = 56.0;
@override
initState() {
_animationController =
AnimationController(vsync: this, duration: Duration(milliseconds: 500))
..addListener(() {
setState(() {});
});
_animateIcon =
Tween<double>(begin: 0.0, end: 1.0).animate(_animationController);
_buttonColor = ColorTween(
begin: Colors.blue,
end: Colors.red,
).animate(CurvedAnimation(
parent: _animationController,
curve: Interval(
0.00,
1.00,
curve: Curves.linear,
),
));
_translateButton = Tween<double>(
begin: _fabHeight,
end: -14.0,
).animate(CurvedAnimation(
parent: _animationController,
curve: Interval(
0.0,
0.75,
curve: _curve,
),
));
super.initState();
}
@override
dispose() {
_animationController.dispose();
super.dispose();
}
animate() {
if (!isOpened) {
_animationController.forward();
} else {
_animationController.reverse();
}
isOpened = !isOpened;
}
Widget add() {
return Container(
child: FloatingActionButton(
onPressed: null,
tooltip: 'Add',
child: Icon(Icons.add),
),
);
}
Widget image() {
return Container(
child: FloatingActionButton(
onPressed: null,
tooltip: 'Image',
child: Icon(Icons.image),
),
);
}
Widget inbox() {
return Container(
child: FloatingActionButton(
onPressed: null,
tooltip: 'Inbox',
child: Icon(Icons.inbox),
),
);
}
Widget toggle() {
return Container(
child: FloatingActionButton(
backgroundColor: _buttonColor.value,
onPressed: animate,
tooltip: 'Toggle',
child: AnimatedIcon(
icon: AnimatedIcons.menu_close,
progress: _animateIcon,
),
),
);
}
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
Transform(
transform: Matrix4.translationValues(
0.0,
_translateButton.value * 3.0,
0.0,
),
child: add(),
),
Transform(
transform: Matrix4.translationValues(
0.0,
_translateButton.value * 2.0,
0.0,
),
child: image(),
),
Transform(
transform: Matrix4.translationValues(
0.0,
_translateButton.value,
0.0,
),
child: inbox(),
),
toggle(),
],
);
}
}
Quiero usar este widget en la Fluttervista de lista, que debe estar en donde aparece chasqué, por ejemplo supones que tengo IconButtonen ListViewartículos, cuando hago clic en que, este widget debe ser aparece en posición seleccionada y Buttondebe serFloatingActionButton
Respuestas
Implementé esto usando Stacky AnimatedContainer.
- usando
PositionedenStack, lo coloqué en la parte inferior. La razón de esto es alinear ambosContaineryFABen la misma posición cuando se anima. - usando
AnimatedContainer, hice una animación simple que cambia su altura cuando tocamosFABusando el valor bool.
(Agrego un contenedor adicional en la columna, se ocultará detrás de FAB y también lo alineará perfectamente, pero puede agregar SizedBox o Container sin color y mantener su tamaño como 54.0 por fin, si no está usando list.generate)
Prueba esto en DartPad
import 'package:flutter/material.dart';
final Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Container(
width: 250,
height: 250,
color: Colors.white,
child: YellowBird(),
)),
),
);
}
}
class YellowBird extends StatefulWidget {
const YellowBird({Key key}) : super(key: key);
@override
_YellowBirdState createState() => _YellowBirdState();
}
class _YellowBirdState extends State<YellowBird> {
bool animate = true;
@override
Widget build(BuildContext context) {
return Stack(
alignment: AlignmentDirectional.topCenter,
children: [
Positioned(
bottom: 0,
child: AnimatedContainer(
width: 54.0,
decoration: BoxDecoration(
color: Colors.redAccent,
borderRadius: BorderRadius.all(Radius.circular(360))
),
height: animate ? 56.0 : 250.0,
duration: Duration(milliseconds: 300),
child: animate
? Container()
: Column(
children: List.generate(
4,
(i) => Expanded(
child: Container(
width: 50,
height: 50,
decoration: BoxDecoration(
color: Colors.white,
shape: BoxShape.circle,
),
),
),
),
),
),
),
Positioned(
bottom: 0,
child: FloatingActionButton(
backgroundColor: Colors.grey,
child: Icon(animate ? Icons.menu : Icons.close, size: 30),
onPressed: () {
setState(() {
animate = !animate;
});
})),
]);
}
}
avíseme si esto funciona o hay algo que cambiar de esto.
hola por favor mire esta biblioteca ... https://pub.dev/packages/flutter_portal esta es la forma más sencilla de crear una superposición en Flutter ...
PortalEntry(
visible: isMenuVisible, //true Or False
portalAnchor: Alignment.topLeft,
childAnchor: Alignment.topRight,
portal: TheMenuWidget, // option 1 + option 2 (White)
child: MyButton, // show Menu Button (Grey)
)