profile_view 0.0.1
profile_view: ^0.0.1 copied to clipboard
Open Profile Images in instagram like Styles.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:profile_view/profile_view.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Profile View',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const ProfilePage(),
);
}
}
class ProfilePage extends StatelessWidget {
const ProfilePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
const Expanded(flex: 2, child: _TopPortion()),
Expanded(
flex: 3,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: [
Text(
"Imtiaz Ahmad",
style: Theme.of(context)
.textTheme
.headline6
?.copyWith(fontWeight: FontWeight.bold),
),
const SizedBox(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
FloatingActionButton.extended(
onPressed: () {},
heroTag: 'follow',
elevation: 0,
label: const Text("Follow"),
icon: const Icon(Icons.person_add_alt_1),
),
const SizedBox(width: 16.0),
FloatingActionButton.extended(
onPressed: () {},
heroTag: 'mesage',
elevation: 0,
backgroundColor: Colors.red,
label: const Text("Message"),
icon: const Icon(Icons.message_rounded),
),
],
),
const SizedBox(height: 16),
const _ProfileInfoRow()
],
),
),
),
],
),
);
}
}
class _ProfileInfoRow extends StatelessWidget {
const _ProfileInfoRow({Key? key}) : super(key: key);
final List<ProfileInfoItem> _items = const [
ProfileInfoItem("Posts", 900),
ProfileInfoItem("Followers", 120),
ProfileInfoItem("Following", 200),
];
@override
Widget build(BuildContext context) {
return Container(
height: 80,
constraints: const BoxConstraints(maxWidth: 400),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: _items
.map((item) => Expanded(
child: Row(
children: [
if (_items.indexOf(item) != 0) const VerticalDivider(),
Expanded(child: _singleItem(context, item)),
],
)))
.toList(),
),
);
}
Widget _singleItem(BuildContext context, ProfileInfoItem item) => Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
item.value.toString(),
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
),
),
),
Text(
item.title,
style: Theme.of(context).textTheme.caption,
)
],
);
}
class ProfileInfoItem {
final String title;
final int value;
const ProfileInfoItem(this.title, this.value);
}
class _TopPortion extends StatelessWidget {
const _TopPortion({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Stack(
fit: StackFit.expand,
children: [
Container(
margin: const EdgeInsets.only(bottom: 50),
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.bottomCenter,
end: Alignment.topCenter,
colors: [Color(0xff0043ba), Color(0xff006df1)]),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(50),
bottomRight: Radius.circular(50),
)),
),
const Align(
alignment: Alignment.topCenter,
child: Padding(
padding: EdgeInsets.only(top: 35.0),
child: Text(
"ProfileView Example",
style: TextStyle(color: Colors.white, fontSize: 22),
),
)),
Align(
alignment: Alignment.bottomCenter,
child: SizedBox(
width: 150,
height: 150,
child: Stack(
fit: StackFit.expand,
children: [
const ProfileView(
child: CircleAvatar(
// radius: 10,
backgroundImage: NetworkImage(
"https://img.freepik.com/free-photo/assortment-pieces-cake_114579-28235.jpg",
),
),
),
Positioned(
bottom: 0,
right: 0,
child: CircleAvatar(
radius: 20,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
child: Container(
margin: const EdgeInsets.all(8.0),
decoration: const BoxDecoration(
color: Colors.green, shape: BoxShape.circle),
),
),
),
],
),
),
),
],
);
}
}