Created
November 10, 2016 09:08
-
-
Save terut/40b4883052bb1fa4e19629a27294117f to your computer and use it in GitHub Desktop.
Create list with Flutter.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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