1628590179
Swipe to navigate back and admire beautifully morphing widgets.
SwipeablePageRoute is a specialized CupertinoPageRoute that allows your users to go back by swiping anywhere on the current page. Use it instead of MaterialPageRoute or CupertinoPageRoute:
Navigator.of(context).push(SwipeablePageRoute(
builder: (BuildContext context) => MyPageContent(),
));
If your page contains horizontally scrollable content, you can limit SwipeablePageRoute to only react on drags from the start (left in LTR, right in RTL) screen edge — just like CupertinoPageRoute:
Navigator.of(context).push(SwipeablePageRoute(
onlySwipeFromEdge: true,
builder: (BuildContext context) => MyHorizontallyScrollablePageContent(),
));
You can get the SwipeablePageRoute wrapping your current page using context.getSwipeablePageRoute<T>().
As you can see in the demo above, there's a beautiful animation happening to the AppBar. That's a MorphingAppBar!
You can construct MorphingAppBar (corresponds to AppBar) and MorphingSliverAppBar (corresponds to SliverAppBar) just like the originals:
MorphingAppBar(
backgroundColor: Colors.green,
title: Text('My Page'),
actions: <Widget>[
IconButton(
key: ValueKey('play'),
icon: Icon(Icons.play_arrow),
onPressed: () {},
),
IconButton(
key: ValueKey('favorite'),
icon: Icon(Icons.favorite),
onPressed: () {},
),
PopupMenuButton<void>(
key: ValueKey('overflow'),
itemBuilder: (context) {
return [
PopupMenuItem<void>(child: Text('Overflow action 1')),
PopupMenuItem<void>(child: Text('Overflow action 2')),
];
},
),
],
bottom: TabBar(
tabs: <Widget>[
Tab(text: 'Tab 1'),
Tab(text: 'Tab 2'),
Tab(text: 'Tab 3'),
],
),
)
Both MorphingAppBars internally use Heros, so if you're not navigating directly inside a MaterialApp, you have to add a HeroController to your Navigator:
Navigator(
observers: [HeroController()],
onGenerateRoute: // ...
)
To animate additions, removals, and constants in your AppBars actions, we compare them using Widget.canUpdate(Widget old, Widget new). It compares Widgets based on their type and key, so it's recommended to give every action Widget a key (that you reuse across pages) for correct animations.
Run this command:
With Flutter:
$ flutter pub add swipeable_page_route
This will add a line like this to your package's pubspec.yaml (and run an implicit dart pub get):
dependencies:
swipeable_page_route: ^0.2.3
Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.
Now in your Dart code, you can use:
import 'package:swipeable_page_route/swipeable_page_route.dart';
import 'package:black_hole_flutter/black_hole_flutter.dart';
import 'package:flutter/material.dart';
import 'package:swipeable_page_route/swipeable_page_route.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '🔙 swipeable_page_route example',
home: FirstPage(),
);
}
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MorphingAppBar(
title: Text('🔙 swipeable_page_route example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
context.navigator
.push<void>(SwipeablePageRoute(builder: (_) => SecondPage()));
},
child: Text('Open page 2'),
),
),
);
}
}
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
// Gets the `SwipeablePageRoute` wrapping the current page.
final pageRoute = context.getSwipeablePageRoute<void>()!;
return Scaffold(
appBar: MorphingAppBar(
title: Text('Page 2'),
actions: <Widget>[
IconButton(
key: ValueKey('check'),
icon: Icon(Icons.check),
onPressed: () {},
),
IconButton(
key: ValueKey('star'),
icon: Icon(Icons.star),
onPressed: () {},
),
IconButton(
key: ValueKey('play_arrow'),
icon: Icon(Icons.play_arrow),
onPressed: () {},
),
PopupMenuButton<void>(
itemBuilder: (context) => [
PopupMenuItem(child: Text('One')),
PopupMenuItem(child: Text('Two')),
],
),
],
),
body: SizedBox.expand(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Can swipe: ${pageRoute.canSwipe}'),
TextButton(
onPressed: () {
// You can disable swiping completely using `canSwipe`:
setState(() => pageRoute.canSwipe = !pageRoute.canSwipe);
},
child: Text('Toggle'),
),
SizedBox(height: 32),
ElevatedButton(
onPressed: () {
context.navigator.push<void>(SwipeablePageRoute(
// This option has to be enabled for pages with horizontally
// scrollable content, as otherwise, `SwipeablePageRoute`'s
// swipe-gesture intercepts those gestures in the page. This way,
// only swipes starting from the left (LTR) or right (RTL) screen
// edge can be used to navigate back.
canOnlySwipeFromEdge: true,
// You can customize the width of the detection area with
// `backGestureDetectionWidth`.
builder: (_) => ThirdPage(),
));
},
child: Text('Open page 3'),
),
],
),
),
);
}
}
class ThirdPage extends StatefulWidget {
@override
_ThirdPageState createState() => _ThirdPageState();
}
class _ThirdPageState extends State<ThirdPage>
with SingleTickerProviderStateMixin {
static const _tabCount = 3;
late final TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: _tabCount, vsync: this);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MorphingAppBar(
backgroundColor: Colors.green,
title: Text('Page 3'),
actions: <Widget>[
IconButton(
key: ValueKey('star'),
icon: Icon(Icons.star),
onPressed: () {},
),
IconButton(
key: ValueKey('play_arrow'),
icon: Icon(Icons.play_arrow),
onPressed: () {},
),
IconButton(
key: ValueKey('favorite'),
icon: Icon(Icons.favorite),
onPressed: () {},
),
PopupMenuButton<void>(
itemBuilder: (context) => [
PopupMenuItem(child: Text('One')),
PopupMenuItem(child: Text('Two')),
],
),
],
bottom: TabBar(
controller: _tabController,
indicatorColor: Colors.white,
isScrollable: true,
tabs: <Widget>[
for (var i = 0; i < _tabCount; i++) Tab(text: 'Tab ${i + 1}'),
],
),
),
body: TabBarView(
controller: _tabController,
children: [
for (var i = 0; i < _tabCount; i++)
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('This is tab ${i + 1}'),
ElevatedButton(
onPressed: () {
context.navigator.push<void>(
SwipeablePageRoute(builder: (_) => SecondPage()),
);
},
child: Text('Open page 2'),
),
],
),
],
),
);
}
}
Author: JonasWanke
Official Website: https://github.com/JonasWanke/swipeable_page_route
1625681940
In this video tutorial, we create the bottom navigation bar for our application and create empty pages for our items in the bottom navigation.
Link to source code: https://github.com/Flutter-Zone/Flutter-Zone-Food-App
Design Inspirations:
https://www.behance.net/gallery/74505097/Foodiee-Food-ordering-App-UI-kit?tracking_source=search|food app
Keep calm and watch the tutorial.
#food delivery app #navigation and pages #navigation #pages
1628590179
Swipe to navigate back and admire beautifully morphing widgets.
SwipeablePageRoute is a specialized CupertinoPageRoute that allows your users to go back by swiping anywhere on the current page. Use it instead of MaterialPageRoute or CupertinoPageRoute:
Navigator.of(context).push(SwipeablePageRoute(
builder: (BuildContext context) => MyPageContent(),
));
If your page contains horizontally scrollable content, you can limit SwipeablePageRoute to only react on drags from the start (left in LTR, right in RTL) screen edge — just like CupertinoPageRoute:
Navigator.of(context).push(SwipeablePageRoute(
onlySwipeFromEdge: true,
builder: (BuildContext context) => MyHorizontallyScrollablePageContent(),
));
You can get the SwipeablePageRoute wrapping your current page using context.getSwipeablePageRoute<T>().
As you can see in the demo above, there's a beautiful animation happening to the AppBar. That's a MorphingAppBar!
You can construct MorphingAppBar (corresponds to AppBar) and MorphingSliverAppBar (corresponds to SliverAppBar) just like the originals:
MorphingAppBar(
backgroundColor: Colors.green,
title: Text('My Page'),
actions: <Widget>[
IconButton(
key: ValueKey('play'),
icon: Icon(Icons.play_arrow),
onPressed: () {},
),
IconButton(
key: ValueKey('favorite'),
icon: Icon(Icons.favorite),
onPressed: () {},
),
PopupMenuButton<void>(
key: ValueKey('overflow'),
itemBuilder: (context) {
return [
PopupMenuItem<void>(child: Text('Overflow action 1')),
PopupMenuItem<void>(child: Text('Overflow action 2')),
];
},
),
],
bottom: TabBar(
tabs: <Widget>[
Tab(text: 'Tab 1'),
Tab(text: 'Tab 2'),
Tab(text: 'Tab 3'),
],
),
)
Both MorphingAppBars internally use Heros, so if you're not navigating directly inside a MaterialApp, you have to add a HeroController to your Navigator:
Navigator(
observers: [HeroController()],
onGenerateRoute: // ...
)
To animate additions, removals, and constants in your AppBars actions, we compare them using Widget.canUpdate(Widget old, Widget new). It compares Widgets based on their type and key, so it's recommended to give every action Widget a key (that you reuse across pages) for correct animations.
Run this command:
With Flutter:
$ flutter pub add swipeable_page_route
This will add a line like this to your package's pubspec.yaml (and run an implicit dart pub get):
dependencies:
swipeable_page_route: ^0.2.3
Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.
Now in your Dart code, you can use:
import 'package:swipeable_page_route/swipeable_page_route.dart';
import 'package:black_hole_flutter/black_hole_flutter.dart';
import 'package:flutter/material.dart';
import 'package:swipeable_page_route/swipeable_page_route.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '🔙 swipeable_page_route example',
home: FirstPage(),
);
}
}
class FirstPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MorphingAppBar(
title: Text('🔙 swipeable_page_route example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
context.navigator
.push<void>(SwipeablePageRoute(builder: (_) => SecondPage()));
},
child: Text('Open page 2'),
),
),
);
}
}
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
Widget build(BuildContext context) {
// Gets the `SwipeablePageRoute` wrapping the current page.
final pageRoute = context.getSwipeablePageRoute<void>()!;
return Scaffold(
appBar: MorphingAppBar(
title: Text('Page 2'),
actions: <Widget>[
IconButton(
key: ValueKey('check'),
icon: Icon(Icons.check),
onPressed: () {},
),
IconButton(
key: ValueKey('star'),
icon: Icon(Icons.star),
onPressed: () {},
),
IconButton(
key: ValueKey('play_arrow'),
icon: Icon(Icons.play_arrow),
onPressed: () {},
),
PopupMenuButton<void>(
itemBuilder: (context) => [
PopupMenuItem(child: Text('One')),
PopupMenuItem(child: Text('Two')),
],
),
],
),
body: SizedBox.expand(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Can swipe: ${pageRoute.canSwipe}'),
TextButton(
onPressed: () {
// You can disable swiping completely using `canSwipe`:
setState(() => pageRoute.canSwipe = !pageRoute.canSwipe);
},
child: Text('Toggle'),
),
SizedBox(height: 32),
ElevatedButton(
onPressed: () {
context.navigator.push<void>(SwipeablePageRoute(
// This option has to be enabled for pages with horizontally
// scrollable content, as otherwise, `SwipeablePageRoute`'s
// swipe-gesture intercepts those gestures in the page. This way,
// only swipes starting from the left (LTR) or right (RTL) screen
// edge can be used to navigate back.
canOnlySwipeFromEdge: true,
// You can customize the width of the detection area with
// `backGestureDetectionWidth`.
builder: (_) => ThirdPage(),
));
},
child: Text('Open page 3'),
),
],
),
),
);
}
}
class ThirdPage extends StatefulWidget {
@override
_ThirdPageState createState() => _ThirdPageState();
}
class _ThirdPageState extends State<ThirdPage>
with SingleTickerProviderStateMixin {
static const _tabCount = 3;
late final TabController _tabController;
@override
void initState() {
super.initState();
_tabController = TabController(length: _tabCount, vsync: this);
}
@override
void dispose() {
_tabController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: MorphingAppBar(
backgroundColor: Colors.green,
title: Text('Page 3'),
actions: <Widget>[
IconButton(
key: ValueKey('star'),
icon: Icon(Icons.star),
onPressed: () {},
),
IconButton(
key: ValueKey('play_arrow'),
icon: Icon(Icons.play_arrow),
onPressed: () {},
),
IconButton(
key: ValueKey('favorite'),
icon: Icon(Icons.favorite),
onPressed: () {},
),
PopupMenuButton<void>(
itemBuilder: (context) => [
PopupMenuItem(child: Text('One')),
PopupMenuItem(child: Text('Two')),
],
),
],
bottom: TabBar(
controller: _tabController,
indicatorColor: Colors.white,
isScrollable: true,
tabs: <Widget>[
for (var i = 0; i < _tabCount; i++) Tab(text: 'Tab ${i + 1}'),
],
),
),
body: TabBarView(
controller: _tabController,
children: [
for (var i = 0; i < _tabCount; i++)
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('This is tab ${i + 1}'),
ElevatedButton(
onPressed: () {
context.navigator.push<void>(
SwipeablePageRoute(builder: (_) => SecondPage()),
);
},
child: Text('Open page 2'),
),
],
),
],
),
);
}
}
Author: JonasWanke
Official Website: https://github.com/JonasWanke/swipeable_page_route
1594769040
This is an example of Bottom Tab View inside Navigation Drawer / Sidebar with React Navigation in React Native. We will use react-navigation to make a navigation drawer and Tab in this example. I hope you have already seen our post on React Native Navigation Drawer because in this post we are just extending the last post to show the Bottom Tab View inside the Navigation Drawer.
In this example, we have a navigation drawer with 3 screens in the navigation menu and a Bottom Tab on the first screen of the Navigation Drawer. When we open Screen1 the Bottom Tab will be visible and on the other options, this Bottom Tab will be invisible.
<NavigationContainer>
<Drawer.Navigator
drawerContentOptions={{
activeTintColor: '#e91e63',
itemStyle: { marginVertical: 5 },
}}>
<Drawer.Screen
name="HomeScreenStack"
options={{ drawerLabel: 'Home Screen Option' }}
component={HomeScreenStack} />
<Drawer.Screen
name="SettingScreenStack"
options={{ drawerLabel: 'Setting Screen Option' }}
component={SettingScreenStack} />
</Drawer.Navigator>
</NavigationContainer>
<Tab.Navigator
initialRouteName="HomeScreen"
tabBarOptions={{
activeTintColor: 'tomato',
inactiveTintColor: 'gray',
style: {
backgroundColor: '#e0e0e0',
},
labelStyle: {
textAlign: 'center',
fontSize: 16
},
}}>
<Tab.Screen
name="HomeScreen"
component={HomeScreen}
options={{
tabBarLabel: 'Home Screen',
// tabBarIcon: ({ color, size }) => (
// <MaterialCommunityIcons name="home" color={color} size={size} />
// ),
}} />
<Tab.Screen
name="ExploreScreen"
component={ExploreScreen}
options={{
tabBarLabel: 'Explore Screen',
// tabBarIcon: ({ color, size }) => (
// <MaterialCommunityIcons name="settings" color={color} size={size} />
// ),
}} />
</Tab.Navigator>
In this example, we will make a Tab Navigator inside a Drawer Navigator so let’s get started.
Getting started with React Native will help you to know more about the way you can make a React Native project. We are going to use react-native init to make our React Native App. Assuming that you have node installed, you can use npm to install the react-native-cli
command line utility. Open the terminal and go to the workspace and run
npm install -g react-native-cli
Run the following commands to create a new React Native project
react-native init ProjectName
If you want to start a new project with a specific React Native version, you can use the --version argument:
react-native init ProjectName --version X.XX.X
react-native init ProjectName --version react-native@next
This will make a project structure with an index file named App.js in your project directory.
#bottom navigation #drawer navigation #react #react navigation
1599763611
https://www.mrdeluofficial.com/2020/09/how-to-delete-a-facebook-page-with-screenshots/
#delete #facebook #page #delete a facebook page #how to delete a facebook page
1597321578
In this article, I will discuss Razor Pages vs MVC on how to choose in ASP.NET Core web applications. You will also see which type of web application is well suited for your project or requirement by looking at benefits and code comparison.
#.net core #.net core razor pages vs mvc #mvc vs razor pages #razor pages vs mvc #razor pages vs mvc how to choose