Stunning Tinder Clone Flutter App
Swipe left to reject and right to match, like in Tinder. This is a tinder clone flutter app that feature. This project is for intermediate level programmers to sharpen their flutter development skills.
TCard
Tinder like cards. Tinder clone flutter app mimicking the card feature.
Install
Get it from pub.
Add the dependency to your pubspec.yaml. The same way as the animation widget we talked about in: A complete animation widget for rotation with flutter.
# pubspec.yaml dependencies: tcard: ^1.3.3
Uasge
Normal widget
List<Widget> cards = List.generate( 5, (index) => Container( color: Colors.blue, child: Center( child: Text( '$index', style: TextStyle(fontSize: 60, color: Colors.white), ), ), ), ); TCard( cards: cards, )
Network image
List<String> images = [ 'https://gank.io/images/5ba77f3415b44f6c843af5e149443f94', 'https://gank.io/images/02eb8ca3297f4931ab64b7ebd7b5b89c', 'https://gank.io/images/31f92f7845f34f05bc10779a468c3c13', 'https://gank.io/images/b0f73f9527694f44b523ff059d8a8841', 'https://gank.io/images/1af9d69bc60242d7aa2e53125a4586ad', ]; List<Widget> cards = List.generate( images.length, (int index) { return Container( decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(16.0), boxShadow: [ BoxShadow( offset: Offset(0, 17), blurRadius: 23.0, spreadRadius: -13.0, color: Colors.black54, ) ], ), child: ClipRRect( borderRadius: BorderRadius.circular(16.0), child: Image.network( images[index], fit: BoxFit.cover, ), ), ); }, ); TCard( size: Size(400, 600), cards: cards, );
Image from gank.io
Use a controller to control
class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { TCardController _controller = TCardController(); @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( body: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ TCard( cards: cards, size: Size(360, 480), controller: _controller, onForward: (index, info) { print(index); }, onBack: (index, info) { print(index); }, onEnd: () { print('end'); }, ), SizedBox( height: 40, ), Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: <Widget>[ OutlineButton( onPressed: () { print(_controller); _controller.back(); }, child: Text('Back'), ), OutlineButton( onPressed: () { _controller.reset(); }, child: Text('Reset'), ), OutlineButton( onPressed: () { _controller.forward(); }, child: Text('Forward'), ), ], ), ], ), ), ); } }
Determine the sliding direction
TCard( cards: cards, size: Size(360, 480), controller: _controller, onForward: (index, info) { print(index); print(info.direction); if (info.direction == SwipDirection.Right) { print('like'); } else { print('dislike'); } }, onBack: (index, info) { print(index); }, onEnd: () { print('end'); }, )
Reset width new cards
List<Widget> newCards = []; TCardController _controller = TCardController(); _controller.reset(cards: newCards);
Property
property | type | default | description | required |
---|---|---|---|---|
cards | List<Widget> | null | Render cards | true |
size | Size | null | Card size | false |
controller | TCardController | null | Card controller | false |
onForward | ForwardCallback | null | Forward animation callback | false |
onBack | BackCallback | null | Back animation callback | false |
onEnd | EndCallback | null | Forward end callback | false |
lockYAxis | bool | false | Lock Y Axis Gesture | false |
slideSpeed | double | 20 | How quick should it be slided? less is slower. 10 is a bit slow. 20 is a quick enough. | false |
delaySlideFor | int | 500 | How long does it have to wait until the next slide is sliable? less is quicker. 100 is fast enough. 500 is a bit slow. | false |
GitHub Repository
If you want to follow the app more closely, here is a link to the github page: