import 'package:flutter/material.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:cupertino_controllers/cupertino_controllers.dart'; import '../details/screen.dart'; import 'package:flutter/cupertino.dart'; class TableViewScreen extends StatefulWidget { @override TableViewScreenState createState() { return new TableViewScreenState(); } } class TableViewScreenState extends State with SingleTickerProviderStateMixin { bool _isEditing = false; bool _isSearching = false; String _search = ""; final TextEditingController _controller = TextEditingController(); final FocusNode _focusNode = FocusNode(); Animation _animation; AnimationController _animationController; @override void initState() { _animationController = new AnimationController( duration: new Duration(milliseconds: 200), vsync: this, ); _animation = new CurvedAnimation( parent: _animationController, curve: Curves.easeInOut, reverseCurve: Curves.easeInOut, ); _focusNode.addListener(() { if (!_animationController.isAnimating) { _animationController.forward(); } }); super.initState(); } final Map children = const { 0: Text('Select'), 1: Text('Remove'), 2: Text('None'), }; int sharedValue = 0; final List selected = []; void _removeItem(List item) { setState(() { contacts.remove(item); }); } List> _searchItems(BuildContext context, {String search = ""}) { final List> filtered = []; for (var _row in contacts) { bool _contains = false; if (_row[0].toLowerCase().trim().contains(search.toLowerCase().trim())) _contains = true; if (_row[1].toLowerCase().trim().contains(search.toLowerCase().trim())) _contains = true; if (_row[2].toLowerCase().trim().contains(search.toLowerCase().trim())) _contains = true; if (_contains) { // filtered.add(_buildListTile(context, _row)); filtered.add(_row); } } return filtered ?? []; } @override Widget build(BuildContext context) { if (_isSearching) FocusScope.of(context).requestFocus(_focusNode); var _sections = []; _sections = _buildSections(context, data: _search != null && _search.isNotEmpty ? _searchItems(context, search: _search) : contacts); return CupertinoTableViewController.sectioned( hideAppBarOnSearch: true, trailing: GestureDetector( child: Icon( CupertinoIcons.share, color: CupertinoColors.activeBlue, ), onTap: () {}, ), sections: _sections ?? [], widgets: [ SafeArea( top: _isSearching, bottom: false, child: CupertinoSearchBar( controller: _controller, focusNode: _focusNode, animation: _animation, onCancel: () { _controller.clear(); _focusNode.unfocus(); _animationController.reverse(); setState(() { _search = ""; }); }, onClear: () { _controller.clear(); setState(() { _search = ""; }); }, onChanged: (String value) { if (value != null) setState(() { _search = value; }); }, ), ), Container( padding: EdgeInsets.only(top: 8.0), child: CupertinoSegmentedControl( children: children, onValueChanged: (int newValue) { setState(() { sharedValue = newValue; }); }, groupValue: sharedValue, ), ), Divider(), ], onRefresh: () async { await Future.delayed(Duration(seconds: 1)); return; }, isEditing: _isEditing, onEditing: (bool value) { if (value != null) { setState(() { _isEditing = value; }); if (!_isEditing) { setState(() { selected.clear(); }); } } }, isSearching: _isSearching, showEditingButtonLeft: true, ); } List _buildSections(BuildContext context, {@required List> data}) { data.sort((a, b) { return a[0].toLowerCase().compareTo(b[0].toLowerCase()); }); List sections = []; var map = Map(); for (List _contact in data) { final String _letter = _contact[0].substring(0, 1).toUpperCase(); map[_letter] = []; } for (List _contact in data) { final String _letter = _contact[0].substring(0, 1).toUpperCase(); map[_letter].add(_contact); } for (String _key in map.keys) { sections.add(CupertinoTableViewSection.builder( header: Text(_key, style: TextStyle( fontWeight: FontWeight.bold, )), itemBuilder: (BuildContext context, int index) { return _buildListTile(context, map[_key][index]); }, itemCount: map[_key]?.length ?? 0, )); } return sections; } Widget _buildListTile(BuildContext context, List item) { final bool _selected = selected?.contains(item) ?? false; CupertinoEditingAction _action; switch (sharedValue) { case 0: _action = CupertinoEditingAction.select; break; case 1: _action = CupertinoEditingAction.remove; break; case 2: _action = CupertinoEditingAction.none; break; default: } return new Slidable( key: Key(item[0]), dismissal: SlidableDismissal( child: SlidableDrawerDismissal(), onDismissed: (actionType) { _removeItem(item); }, ), actionPane: SlidableDrawerActionPane(), actionExtentRatio: 0.25, closeOnScroll: true, child: CupertinoListTile( selected: _selected, editing: _isEditing, avatar: Container( height: 60.0, width: 60.0, decoration: BoxDecoration( color: Colors.lightBlue, borderRadius: BorderRadius.circular(8.0), ), ), leading: Icons.phone, title: Text(item[0]), subtitle: Text(item[1]), trailing: [ Text(item[2]), ], onTap: () { if (_isEditing) { if (_action == CupertinoEditingAction.select) { if (_selected) { setState(() { selected.remove(item); }); } else { setState(() { selected.add(item); }); } } } else { Navigator.push( context, CupertinoPageRoute( title: "Details", builder: (BuildContext context) => DetailsScreen())); } }, ios: CupertinoListTileData( hideLeadingIcon: true, style: CupertinoCellStyle.subtitle, accessory: CupertinoAccessory.disclosureIndicator, editingAction: _action, editingAccessory: CupertinoEditingAccessory.detail, editingAccessoryTap: () { Navigator.push( context, CupertinoPageRoute( title: "Details", builder: (BuildContext context) => DetailsScreen())); }, editingActionTap: _action == CupertinoEditingAction.remove ? () => _removeItem(item) : null), // onTap: () {}, ), // actions: [ // new IconSlideAction( // caption: 'Archive', // color: Colors.blue, // icon: Icons.archive, // onTap: () {}, // ), // new IconSlideAction( // caption: 'Share', // color: Colors.indigo, // icon: Icons.share, // onTap: () {}, // ), // ], secondaryActions: [ // new IconSlideAction( // caption: 'More', // color: Colors.black45, // icon: Icons.more_horiz, // onTap: () {}, // ), new IconSlideAction( caption: 'Delete', color: Colors.red, icon: Icons.delete, onTap: () => _removeItem(item), ), ], ); } } List> contacts = >[ ['George Washington', 'Westmoreland County', ' 4/30/1789'], ['John Adams', 'Braintree', ' 3/4/1797'], ['Thomas Jefferson', 'Shadwell', ' 3/4/1801'], ['James Madison', 'Port Conway', ' 3/4/1809'], ['James Monroe', 'Monroe Hall', ' 3/4/1817'], ['Andrew Jackson', 'Waxhaws Region South/North', ' 3/4/1829'], ['John Quincy Adams', 'Braintree', ' 3/4/1825'], ['William Henry Harrison', 'Charles City County', ' 3/4/1841'], ['Martin Van Buren', 'Kinderhook New', ' 3/4/1837'], ['Zachary Taylor', 'Barboursville', ' 3/4/1849'], ['John Tyler', 'Charles City County', ' 4/4/1841'], ['James Buchanan', 'Cove Gap', ' 3/4/1857'], ['James K. Polk', 'Pineville North', ' 3/4/1845'], ['Millard Fillmore', 'Summerhill New', '7/9/1850'], ['Franklin Pierce', 'Hillsborough New', ' 3/4/1853'], ['Andrew Johnson', 'Raleigh North', ' 4/15/1865'], ['Abraham Lincoln', 'Sinking Spring', ' 3/4/1861'], ['Ulysses S. Grant', 'Point Pleasant', ' 3/4/1869'], ['Rutherford B. Hayes', 'Delaware', ' 3/4/1877'], ['Chester A. Arthur', 'Fairfield', ' 9/19/1881'], ['James A. Garfield', 'Moreland Hills', ' 3/4/1881'], ['Benjamin Harrison', 'North Bend', ' 3/4/1889'], ['Grover Cleveland', 'Caldwell New', ' 3/4/1885'], ['William McKinley', 'Niles', ' 3/4/1897'], ['Woodrow Wilson', 'Staunton', ' 3/4/1913'], ['William H. Taft', 'Cincinnati', ' 3/4/1909'], ['Theodore Roosevelt', 'New York City New', ' 9/14/1901'], ['Warren G. Harding', 'Blooming Grove', ' 3/4/1921'], ['Calvin Coolidge', 'Plymouth', '8/2/1923'], ['Herbert Hoover', 'West Branch', ' 3/4/1929'], ['Franklin D. Roosevelt', 'Hyde Park New', ' 3/4/1933'], ['Harry S. Truman', 'Lamar', ' 4/12/1945'], ['Dwight D. Eisenhower', 'Denison', ' 1/20/1953'], ['Lyndon B. Johnson', 'Stonewall', '11/22/1963'], ['Ronald Reagan', 'Tampico', ' 1/20/1981'], ['Richard Nixon', 'Yorba Linda', ' 1/20/1969'], ['Gerald Ford', 'Omaha', 'August 9/1974'], ['John F. Kennedy', 'Brookline', ' 1/20/1961'], ['George H. W. Bush', 'Milton', ' 1/20/1989'], ['Jimmy Carter', 'Plains', ' 1/20/1977'], ['George W. Bush', 'New Haven', ' 1/20, 2001'], ['Bill Clinton', 'Hope', ' 1/20/1993'], ['Barack Obama', 'Honolulu', ' 1/20/2009'], ['Donald J. Trump', 'New York City', ' 1/20/2017'], ];