How to transform child widgets in flutter? - dart

I want animate widgets like the below gif
But whats happening is like the below gif
I just added a color to the container to get a sense of the frame of parent container
How can we make the inner widgets to clip when moving out of parent widget?
I am using Transform to animate like projects.
Please let me know if any more info is required.

If you want your red container to clip overflow, you have to wrap it into a ClipRect.
new ClipRect(
child: new Container(color: Colors.red, child: myAnimationThing),
),

Related

How to present views above the BottomNavigationBar on a button tap

I've been wondering how to implement a really cool little feature I saw in the Algorand app. I've attached a picture to help illustrate what I mean.
The middle button of the navigation bar at the bottom animates the Send and Receive button onto the view, and then changes it's icon to a cross. These buttons persist when you navigate to other views through the other 4 bottom navigation bar items. And when you click the middle cross button, they disappear.
I tried for a bit to implement this in Flutter. My best attempt was creating my own Bottom Navigation Bar widget for my scaffold, containing the bottom icons and a couple buttons on top, but this seemed really janky. I'm not asking for specific code examples of how to get this done, just rather a point in the right direction of how to do this kind of thing.
Speaking of specific code, their code is actually open source, and the code for the bottom nav bar is here
https://github.com/algorand/algorand-wallet/blob/master/ios/Classes/ViewControllers/Core/Container/TabBar/TabBarController.swift
I've been reading it but unfortunately my Swift is not all that great, working through it line by line. I can make a custom bottom nav bar with Container and Row, and then figure out the onTap behaviours, but it's the presenting two buttons above it that's really blocking me.
Scaffold’s floatingActionButton parameter is exactly what you’re looking for.
Need two buttons? No problem, it doesn’t have to be a FloatingActionButton, it can be any widget, including a Row.
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FloatingActionButton.extended(
icon: Icon(Icons.arrow_upward),
label: Text('Send'),
onPressed: (){},
backgroundColor: Colors.redAccent),
Padding(padding: EdgeInsets.symmetric(horizontal: 8)),
FloatingActionButton.extended(
icon: Icon(Icons.arrow_downward),
label: Text('Request'),
onPressed: (){},
backgroundColor: Colors.teal),
]
),
Then to trigger it with a button press, just make it conditional:
bool appear = false;
...
floatingActionButton: appear ? Row(...) : null
Then you can make it appear or disappear by changing the boolean in your button’s onPressed (and don’t forget to call setState).

DataTable - make scrollable, set background colour and fix/freeze header row and first column

I've started developing in Flutter with webview, charts, tables, but I met some problems with tables.
I use DataTable to represent data in a table.
There is a first problem. By default, it isn't scrollable if data is out of a screen. So I embedded in some Widgets (i.e. SingleChildScrollView, ListView), but it was scrollable only in one direction (vertical or horizontal). I searched something about it and I found a plugin for both directions (bidirectional_scroll_view 0.0.6). After compilation I received an error
Because app depends on bidirectional_scroll_view >=0.0.2 which
requires SDK version <2.1.0, version solving failed.
I'm using Dart SDK version: >=2.1.0 <3.0.0 in configuration.
Next, I found PaginatedDataTable which allows scrollable in both directions, but it is paginated table.
So anybody know is it possible to somehow scroll DataTable in both directions (vertical and horizontal)?
The second question (more important): is it possible to set background colour in header (first) row and first column in a table? Or even in any cell in a table?
For DataColumn/DataCell I tried embed Text in Container and then set Container colour, but the background colour was only set for text, the rest of a cell was with default colour.
i.e.
DataColumn(label: Container(child: Text('2011'), color: Colors.grey,)),
And is it possible to fixed/freeze header (first) row and first column. I mean the table is scrolled and first row/column is always visible on a screen. I couldn't find any solution ..
Expanded(
child: ListView(
children: <Widget>[
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: DataTable()
)
]
),
)
child: Center(
child: ListView(
children: [
DataTable()
],
scrollDirection: Axis.vertical,
)
)

Top level transitions in flutter

I want to create a layout in which I have a BottomNavigationBar that is used to navigate between five top-level views.
I want to have a transition like the one found in the material design guidelines for top-level peer transitions.
Link
First the current view is faded out, then the selected view is faded in. The problem is that flutter doesn't seem to have more than two steps in a tween animation, meaning that I can't change the opacity from 1.0 to 0.0, then back to 1.0 (Like CSS #keyframes).
Does anyone have any idea how I can accomplish this? Should I use something other than Tween?
I've tried using multiple Tween animations and changing what the Opacity widget's opacity value mid-animation, but doing that doesn't even animate.
You have to use a Stack for that. This stack should contain both the widget to fade out and the widget to fade in. Create two Tweens controlled by the same animation controller, one fading out (going from 1.0 to 0.0), one for fading in. Do this in initState() from the state of an stateful widget:
_animationController =
AnimationController(duration: Duration(milliseconds: 500), vsync: this);
_fadeIn = Tween(begin: 0.0, end: 1.0).animate(_animationController);
_fadeOut = Tween(begin: 1.0, end: 0.0).animate(_animationController);
(The State needs to use the mixin TickerProviderStateMixin or SingleTickerProviderStateMixin).
With widget a to fade out and b to fade in, the widget to be returned by your build-method will look like:
Stack(children: [
FadeTransition(
child: a,
opacity: _fadeOut,
),
FadeTransition(
child: b,
opacity: _fadeIn,
)
]);
Eventually you start the animation by calling
_animationController?.reset();
_animationController?.forward();
from your build-method.
Don't forget to dispose the controller from within the dispose-method of your widget's state.
You may want to construct a general purpose fading widget, which would be a stateful widget with the state inheriting some flavor of TickerProviderMixin.
If you want to have such an animation as a routing transition, then look here. The example given there uses slide transitions but it should be easy to replace those with FadeTransitions for fading out and in.
Edit: found the widget AnimatedSwitcher in the Flutter Widget Library, which does exactly what you want. It is the general purpose widget I spoke of.

Status bar color when navigating to new screen

I am using following in my build() method of 1st screen to change status bar color and it works fine.
// 1st screen's build() method
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(statusBarColor: Colors.green),
);
However when I navigate to 2nd screen the 1st screen status bar color appears on the 2nd screen too. And in 2nd screen's build() method, I am using the same code with different color
// 2nd screen's build() method
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(statusBarColor: Colors.red),
);
I had a similar problem and found the solution. The best way is to use AnnotatedRegion under Scaffold without AppBar (appBar is null) instead of the function SystemChrome.setSystemUIOverlayStyle() to set the system ui color.
Something like:
Scaffold(
body: AnnotatedRegion(
value: SystemUiOverlayStyle(statusBarColor: Colors.red)
child: MyBodyWidget(),
),
);
Btw, the value can be SystemUiOverlayStyle.dark or SystemUiOverlayStyle.light if you only want dark or light overlay instead of a color. Note that statusBarColor only works in Android so far.
Also note that appBar has to be null (absent) for AnnotatedRegion to work. You can write your own MyAppBar widget easily inside MyBodyWidget.
Try setting the 2nd status bar color before doing the Navigator.push to the second screen. Like this
SystemChrome.setSystemUIOverlayStyle(
SystemUiOverlayStyle(statusBarColor: Colors.red),
);
await Navigator.of(context).push(MaterialPageRoute(
builder: (context) => SecondScreen();
));
From Flutter Docs
Call this API in code whose lifecycle matches that of the desired system UI styles. For instance, to change the system UI style on a new page, consider calling when pushing/popping a new PageRoute.
It has a simple solution.
It is one way of several method.(AnnotatedRegion)
First, top parent page buildcontext in Saffold
SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle(
statusBarColor: Colors.transparent, <---- transparent.
and 2nd page of 3rd page ...
if Appbar : Appbar( backgroundcolor: Colors.red <---- want color.
if no Appbar : Scaffold( backgroundcolor: Colors.red <---- want color.
This way, if you do a navigation pop, Page status color return the background color of Appbar or the background color of the scaffold.
It's my shortcut and I hope it helps.

Flutter- How to hold Camera in Screen after clicking photos?

I want to hold the camera screen after clicking the image in the flutter.
Now I am holding the image using container, but its displaying mirror image.
Container(
child:
Center(child:
Image.file(new File(imagePath)))),
return new AspectRatio(
aspectRatio: controller.value.aspectRatio,
child: new CameraPreview(controller),
);
Add a Stack view with preview controller and list to display the captured images list and capture button to capture image.
Add the path to list, use the same list to populate in list view. after taking the no of pictures you need to have a submit button to pop the view.
here is the sample code camera_view_sample_code

Resources