Bloc (State Management) Items Add to Cart Functionality in List Example

import "dart:async";
import "package:flutter/material.dart";

class Todo
{
final String title;
bool completed;
Todo(this.title, {this.completed = false});
}
class TodoBloc
{
final _todoController = StreamController<List<Todo>>.broadcast();
final List<Todo> _todos = [];

Stream<List<Todo>> get todoStream {
return _todoController.stream;
}

void addTodo(Todo todo)
{
_todos.add(todo);
_todoController.sink.add(_todos);
}

void toggleTodoCompletion(int index)
{
_todos[index].completed = !_todos[index].completed;
_todoController.sink.add(_todos);
}

void dispose()
{
_todoController.close();
}
}

void main()
{
runApp(const MyApp());
}
class MyApp extends StatelessWidget
{
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Todo AddToCart App",
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.grey,
),
home: const AddToCart(),
);
}
}
class AddToCart extends StatefulWidget
{
const AddToCart({super.key});
@override
State<AddToCart> createState()
{
return AddToCartState();
}
}
class AddToCartState extends State<AddToCart>
{
final TextEditingController _controller = TextEditingController();
final TodoBloc _todoBloc = TodoBloc();
final List<String> _cartItems = [];

@override
void dispose()
{
_controller.dispose();
_todoBloc.dispose();
super.dispose();
}

void addToCart(String items)
{
setState(() {
_cartItems.add(items);
},);
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Todo App"),
centerTitle: true,
backgroundColor: Colors.grey,
),
body: StreamBuilder<List<Todo>>(
stream: _todoBloc.todoStream,
builder: (context, snapshot) {
return ListView.builder(
itemCount: snapshot.data?.length ?? 0,
itemBuilder: (context, index) {
final todo = snapshot.data![index];
return Card(
child: ListTile(
leading: CircleAvatar(child: Text(todo.title[0]),),
title: Text(todo.title,
style: TextStyle(decoration: todo.completed ? TextDecoration.lineThrough : null),
),
subtitle: Text(todo.title),
trailing: IconButton(
icon: Icon(todo.completed ? Icons.check_box : Icons.check_box_outline_blank),
onPressed: () {
_todoBloc.toggleTodoCompletion(index);
},
),
onTap: () {
addToCart(todo.title);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Added ${todo.title}"),),
);
},
),
);
},
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text("Add data"),
content: TextFormField(
controller: _controller,
decoration: const InputDecoration(
hintText: "Enter the data",
),
),
actions: <Widget>[
ElevatedButton(
onPressed: () {
_todoBloc.addTodo(Todo(_controller.text));
_controller.clear();
Navigator.pop(context);
},
child: const Text("Add", style: TextStyle(fontWeight: FontWeight.bold),),
),
],
);
},
);
},
backgroundColor: Colors.blue,
child: const Icon(Icons.add, color: Colors.white, size: 30.0),
),
persistentFooterButtons: [
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return CartPage2(cartItems: _cartItems);
},
),
);
},
child: const Text("Open Cart"),
),
],
);
}
}
class CartPage2 extends StatelessWidget
{
CartPage2({super.key, required this.cartItems});

final List<String> cartItems;
final TextEditingController _controller = TextEditingController();

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Cart Items"),
centerTitle: true,
backgroundColor: Colors.grey,
),
body: ListView.builder(
itemCount: cartItems.length,
itemBuilder: (context, index) {
return Card(
child: ListTile(
title: Text(cartItems[index]),
subtitle: Text(cartItems[index]),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
IconButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text("Edit data"),
content: TextFormField(
controller: _controller,
decoration: const InputDecoration(
hintText: "Edit data",
),
),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("Edit",
style: TextStyle(fontWeight: FontWeight.bold),
),
),
],
);
},
);
},
icon: const Icon(Icons.edit),
),
IconButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text("Delete data ?",
style: TextStyle(fontWeight: FontWeight.bold),
),
content: const Text("Are you sure to delete data ?"),
actions: <Widget>[
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("No",
style: TextStyle(fontWeight: FontWeight.bold),
),
),
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text("Yes",
style: TextStyle(fontWeight: FontWeight.bold),
),
),
],
);
},
);
},
icon: const Icon(Icons.delete),
),
],
),
),
);
},
),
);
}
}

Comments

Popular posts from this blog

Second GET API Calling with Bloc simple Example in Flutter

Stack Container Scrollable Card widget UI with Custom Widget

Pagination with Bloc Pattern in Flutter