flutter_magento_marketplace 1.2.0
flutter_magento_marketplace: ^1.2.0 copied to clipboard
DEPRECATED: This package has been merged into flutter_magento. Use flutter_magento ^3.6.0 instead. Flutter library for Magento 2 Marketplace functionality with multi-seller support, subdomains, rating [...]
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'screens/products_screen.dart';
import 'screens/search_screen.dart';
import 'screens/notifications_screen.dart';
void main() {
runApp(
const ProviderScope(
child: MarketplaceApp(),
),
);
}
class MarketplaceApp extends StatelessWidget {
const MarketplaceApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Magento Marketplace',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
useMaterial3: true,
appBarTheme: const AppBarTheme(
centerTitle: true,
elevation: 0,
),
),
home: const MarketplaceHomeScreen(),
debugShowCheckedModeBanner: false,
);
}
}
class MarketplaceHomeScreen extends StatefulWidget {
const MarketplaceHomeScreen({super.key});
@override
State<MarketplaceHomeScreen> createState() => _MarketplaceHomeScreenState();
}
class _MarketplaceHomeScreenState extends State<MarketplaceHomeScreen> {
int _selectedIndex = 0;
static final List<Widget> _screens = [
const ProductsScreen(),
const Scaffold(body: Center(child: Text('Categories'))),
const Scaffold(body: Center(child: Text('Favorites'))),
const Scaffold(body: Center(child: Text('Profile'))),
];
void _onItemTapped(int index) {
setState(() {
_selectedIndex = index;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Marketplace'),
actions: [
IconButton(
icon: const Icon(Icons.search),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SearchScreen()),
);
},
),
IconButton(
icon: const Icon(Icons.notifications_outlined),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const NotificationsScreen(),
),
);
},
),
],
),
body: IndexedStack(
index: _selectedIndex,
children: _screens,
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _selectedIndex,
onTap: _onItemTapped,
type: BottomNavigationBarType.fixed,
items: const [
BottomNavigationBarItem(
icon: Icon(Icons.home_outlined),
activeIcon: Icon(Icons.home),
label: 'Home',
),
BottomNavigationBarItem(
icon: Icon(Icons.category_outlined),
activeIcon: Icon(Icons.category),
label: 'Categories',
),
BottomNavigationBarItem(
icon: Icon(Icons.favorite_border),
activeIcon: Icon(Icons.favorite),
label: 'Favorites',
),
BottomNavigationBarItem(
icon: Icon(Icons.person_outline),
activeIcon: Icon(Icons.person),
label: 'Profile',
),
],
),
floatingActionButton: _selectedIndex == 0
? FloatingActionButton.extended(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SearchScreen(),
),
);
},
icon: const Icon(Icons.search),
label: const Text('Search'),
)
: null,
);
}
}
class ProductCard extends StatelessWidget {
final String title;
final String price;
final String imageUrl;
final VoidCallback? onTap;
const ProductCard({
super.key,
required this.title,
required this.price,
required this.imageUrl,
this.onTap,
});
@override
Widget build(BuildContext context) {
return Card(
clipBehavior: Clip.antiAlias,
child: InkWell(
onTap: onTap,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AspectRatio(
aspectRatio: 1,
child: Image.network(
imageUrl,
fit: BoxFit.cover,
width: double.infinity,
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: Theme.of(context).textTheme.titleMedium,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
const SizedBox(height: 4),
Text(
'\$$price',
style: Theme.of(context).textTheme.titleLarge?.copyWith(
color: Theme.of(context).colorScheme.primary,
fontWeight: FontWeight.bold,
),
),
],
),
),
],
),
),
);
}
}