Skip to content

Instantly share code, notes, and snippets.

@terut
Created November 10, 2016 09:08
Show Gist options
  • Save terut/40b4883052bb1fa4e19629a27294117f to your computer and use it in GitHub Desktop.
Save terut/40b4883052bb1fa4e19629a27294117f to your computer and use it in GitHub Desktop.
Create list with Flutter.
import 'dart:io';
import 'dart:async';
import 'dart:convert';
import 'package:csv/csv.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
class Product {
const Product({this.name});
final String name;
}
typedef void CartChangedCallback(Product product, bool inCart);
class ShoppingListItem extends StatelessWidget {
ShoppingListItem({Product product, this.inCart, this.onCartChanged})
: product = product,
super(key: new ObjectKey(product));
final Product product;
final bool inCart;
final CartChangedCallback onCartChanged;
Color _getColor(BuildContext context) {
return inCart ? Colors.black54 : Theme.of(context).primaryColor;
}
TextStyle _getTextStyle(BuildContext context) {
if (!inCart) return null;
return new TextStyle(
color: Colors.black54,
decoration: TextDecoration.lineThrough,
);
}
@override
Widget build(BuildContext context) {
return new ListItem(
onTap: () {
onCartChanged(product, !inCart);
},
leading: new CircleAvatar(
backgroundColor: _getColor(context),
child: new Text(product.name[0]),
),
title: new Text(product.name, style: _getTextStyle(context)),
);
}
}
class ShoppingList extends StatefulWidget {
ShoppingList({Key key, this.products}) : super(key: key);
var products;
@override
_ShoppingListState createState() => new _ShoppingListState();
}
class _ShoppingListState extends State<ShoppingList> {
Set<Product> _shoppingCart = new Set<Product>();
@override
void initState() {
super.initState();
final builder = new ProductBuilder();
builder.build().then((List<Product> list) {
setState(() {
config.products = list;
});
});
}
void _handleCartChanged(Product product, bool inCart) {
setState(() {
if (inCart)
_shoppingCart.add(product);
else
_shoppingCart.remove(product);
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Shopping List'),
),
body: new MaterialList(
type: MaterialListType.oneLineWithAvatar,
children: config.products.map((Product product) {
return new ShoppingListItem(
product: product,
inCart: _shoppingCart.contains(product),
onCartChanged: _handleCartChanged,
);
}),
),
);
}
}
class ProductBuilder {
Future<List<Product>> build() async {
final csvStr = await rootBundle.loadString('assets/csv/all.csv');
final csv = await new CsvToListConverter().convert(csvStr, eol: "\n");
var _kProducts = <Product>[];
csv.forEach((List<String> list) {
_kProducts.add(new Product(name: list[0]));
});
return _kProducts;
}
}
void main() {
runApp(new MaterialApp(
title: 'Shopping List',
home: new ShoppingList(products: []),
));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment