Reputation: 17340
In Flutter
i'm trying to make a simple Facebook
menu, in below screen shot we have number one widget and when i click on that, widget which that is below the current widget, should be resized and grow up and showing another icons into that
this below code which i introduced reference work fine, but it doesn't have background container
in referenced the link Column
used and i changed it to Stack
and doesn't work correctly
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(),
],
);
}
}
I want to use this widget into Flutter
listview, that should be appear where i clicked, for example you suppose i have i IconButton
into ListView
items, when i click on that, this widget should be appear on clicked position and Button
should be FloatingActionButton
Upvotes: 4
Views: 499
Reputation: 3228
hi please look at this library ... https://pub.dev/packages/flutter_portal this is the simplest way to create an overlay in 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)
)
Upvotes: 0
Reputation: 1073
I implemented this using Stack
and AnimatedContainer
.
Positioned
in Stack
, I placed it at bottom. The reason for this is to align both the Container
and FAB
in same position when its animate.AnimatedContainer
, I made a simple animation that changes its height when we tap on FAB
using bool value.(I Add one extra container in column, it will hide behind FAB and also Align it perfectly, but you can add SizedBox or Container without color and keep its size as 54.0 at last, if you're not using list.generate)
Try this on 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;
});
})),
]);
}
}
let me know if this work or Is they anything to change from this.
Upvotes: 4