Advertisement
Sebuahhobi98

mesennger

May 13th, 2023
1,148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Dart 7.48 KB | Source Code | 0 0
  1. Widget chatListSteam() {
  2.       return Expanded(
  3.         child: StreamBuilder(
  4.           stream: msg.data.stream,
  5.           builder: (BuildContext context, AsyncSnapshot<List<Map<String, dynamic>>> snapshot) {
  6.             if (snapshot.hasError) {
  7.               return const Center(child: Text('Something went wrong'));
  8.             }
  9.             if (!snapshot.hasData) {
  10.               return const Center(
  11.                 child: CircularProgressIndicator(
  12.                   color: Colors.blueAccent,
  13.                 ),
  14.               );
  15.             }
  16.  
  17.             WidgetsBinding.instance.addPostFrameCallback((_) {
  18.               _scrollController.jumpTo(_scrollController.position.maxScrollExtent);
  19.             });
  20.             return ListView.builder(
  21.               controller: _scrollController,
  22.               scrollDirection: Axis.vertical,
  23.               shrinkWrap: true,
  24.               cacheExtent: 500,
  25.               keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.manual,
  26.               physics: const ScrollPhysics(),
  27.               padding: EdgeInsets.only(
  28.                 bottom: MediaQuery.of(context).viewInsets.bottom,
  29.               ),
  30.               itemCount: msg.data.length,
  31.               itemBuilder: (ctx, index) {
  32.                 final data = msg.data[index];
  33.                 DateTime now = DateTime.now().toLocal();
  34.                 DateTime tgl = DateTime.parse(data['date_create']);
  35.                 String tglIndo = DateFormat('EEEE, dd/MM/yyyy', 'id_ID').format(tgl);
  36.                 String waktu = data['time_create'];
  37.                 String pesan = _helper.decryptStringStorage(data['pesan']);
  38.  
  39.                 return Container(
  40.                   child: _helper.decryptStringStorage(data['status'].toString()) == '1'
  41.                       ? ChatBubble(
  42.                           clipper: ChatBubbleClipper1(type: BubbleType.sendBubble),
  43.                           alignment: Alignment.topRight,
  44.                           margin: const EdgeInsets.only(top: 0, bottom: 20),
  45.                           backGroundColor: Colors.blue,
  46.                           child: Container(
  47.                             constraints: BoxConstraints(
  48.                               maxWidth: MediaQuery.of(context).size.width * 1,
  49.                             ),
  50.                             child: Text(
  51.                               pesan,
  52.                               style: const TextStyle(color: Colors.white),
  53.                             ),
  54.                           ),
  55.                         )
  56.                       : Column(
  57.                           crossAxisAlignment: CrossAxisAlignment.start,
  58.                           children: [
  59.                             Builder(
  60.                               builder: (context) {
  61.                                 if (now.year == tgl.year && now.month == tgl.month && now.day == tgl.day) {
  62.                                   return Text(
  63.                                     'Hari ini: $waktu',
  64.                                     style: const TextStyle(fontSize: 10),
  65.                                   );
  66.                                 } else {
  67.                                   Duration diff = now.difference(tgl);
  68.                                   if (diff.inDays < 7) {
  69.                                     return Text(
  70.                                       'Kemarin: $tglIndo - $waktu',
  71.                                       style: const TextStyle(fontSize: 10),
  72.                                     );
  73.                                   } else if (diff.inDays > 7) {
  74.                                     return Text('$tglIndo - $waktu');
  75.                                   }
  76.                                 }
  77.                                 return Container();
  78.                               },
  79.                             ),
  80.                             ChatBubble(
  81.                               clipper: ChatBubbleClipper1(type: BubbleType.receiverBubble),
  82.                               backGroundColor: const Color(0xffE7E7ED),
  83.                               margin: const EdgeInsets.only(top: 0, bottom: 20),
  84.                               child: Container(
  85.                                 constraints: BoxConstraints(
  86.                                   maxWidth: MediaQuery.of(context).size.width * 1,
  87.                                 ),
  88.                                 child: Text(
  89.                                   pesan,
  90.                                   style: const TextStyle(color: Colors.black, fontSize: 14),
  91.                                 ),
  92.                               ),
  93.                             ),
  94.                           ],
  95.                         ),
  96.                 );
  97.               },
  98.             );
  99.           },
  100.         ),
  101.       );
  102.     }
  103.  
  104. return Scaffold(
  105.       resizeToAvoidBottomInset: true,
  106.       appBar: AppBar(
  107.         elevation: 5,
  108.         title: const Text("Mesengger"),
  109.       ),
  110.       body: RefreshIndicator(
  111.         onRefresh: onLoad,
  112.         child: ConstrainedBox(
  113.           constraints: BoxConstraints(
  114.             minHeight: height,
  115.             minWidth: width,
  116.           ),
  117.           child: Container(
  118.             margin: EdgeInsets.all(width * 0.03),
  119.             padding: const EdgeInsets.all(0.0),
  120.             color: Colors.white,
  121.             height: height,
  122.             width: width,
  123.             child: Column(
  124.               mainAxisSize: MainAxisSize.min,
  125.               children: <Widget>[
  126.                 chatListSteam(),
  127.                 Align(
  128.                   alignment: Alignment.bottomCenter,
  129.                   child: Container(
  130.                     margin: const EdgeInsets.all(0.0),
  131.                     padding: const EdgeInsets.all(0.0),
  132.                     decoration: BoxDecoration(
  133.                       color: Theme.of(context).cardColor,
  134.                     ),
  135.                     height: 40,
  136.                     child: Row(
  137.                       children: [
  138.                         Expanded(
  139.                           child: TextFormField(
  140.                             onTap: () {},
  141.                             maxLines: 1,
  142.                             controller: _inputMsg,
  143.                             decoration: InputDecoration(
  144.                               contentPadding: const EdgeInsets.only(left: 15),
  145.                               hintText: 'Ketik pesan',
  146.                               border: OutlineInputBorder(
  147.                                 borderRadius: BorderRadius.circular(35.0),
  148.                                 borderSide: const BorderSide(color: Colors.grey),
  149.                               ),
  150.                             ),
  151.                             onChanged: (value) {},
  152.                           ),
  153.                         ),
  154.                         const SizedBox(
  155.                           width: 5,
  156.                         ),
  157.                         CircleAvatar(
  158.                           backgroundColor: Colors.blueAccent,
  159.                           child: IconButton(
  160.                             icon: const Icon(
  161.                               Icons.send,
  162.                               color: Colors.white,
  163.                             ),
  164.                             onPressed: () async {
  165.                               msg.kirimPesan(_inputMsg.text);
  166.                               _inputMsg.clear();
  167.                             },
  168.                           ),
  169.                         ),
  170.                       ],
  171.                     ),
  172.                   ),
  173.                 ),
  174.               ],
  175.             ),
  176.           ),
  177.         ),
  178.       ),
  179.     );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement