conversation 0.0.3 copy "conversation: ^0.0.3" to clipboard
conversation: ^0.0.3 copied to clipboard

Conversation Widget For Flutter.

example/lib/main.dart

import 'dart:math';

import 'package:conversation/conversation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:lipsum/lipsum.dart';

void main() => runApp(AppRoot());

class AppRoot extends StatefulWidget {
  AppRoot({Key key}) : super(key: key);

  @override
  _AppRootState createState() => _AppRootState();
}

class _AppRootState extends State<AppRoot> {
  final GlobalKey<ConversationWidgetState> _key = GlobalKey<ConversationWidgetState>();

  final List<Message> _messages = List<Message>();

  final List<Participant> _participants = List<Participant>();

  @override
  void initState() {
    super.initState();

    _messages.addAll(_generateMessages(0));
    _participants.addAll(_generateParticipants());
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          actions: <Widget>[
            IconButton(
              icon: Icon(Icons.arrow_downward),
              onPressed: () {
                _key.currentState.jumpToLast();
              },
            ),
            IconButton(
              icon: Icon(Icons.arrow_upward),
              onPressed: () {
                _key.currentState.jumpToFirst();
              },
            ),
            IconButton(
              icon: Icon(Icons.message),
              onPressed: () {
                final messages = _generateMessages(_messages.length);
                setState(() {
                  _messages.addAll(messages);
                });
              },
            ),
            IconButton(
              icon: Icon(Icons.done),
              onPressed: () {
                setState(() {
                  _messages.last.state = MessageState.DELIVERED;
                });
              },
            ),
            IconButton(
              icon: Icon(Icons.done_all),
              onPressed: () {
                setState(() {
                  _messages.last.state = MessageState.VIEWED;
                });
              },
            ),
          ],
          title: Text('Conversation'),
        ),
        body: ConversationWidget(
          key: _key,
          messages: _messages,
          messageViewedCallback: (message, index) async {
            await Future.delayed(Duration(seconds: 2));
            setState(() {
              message.state = MessageState.VIEWED;
            });
          },
          participants: _participants,
          sendMessageCallback: (body) async {
            await Future.delayed(Duration(seconds: 3));
            return true;
          },
        ),
      ),
      locale: Locale('en'),
      localizationsDelegates: [
        GlobalMaterialLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en'), // English
        const Locale('he'), // Hebrew
      ],
    );
  }

  Iterable<Message> _generateMessages(
    int from, {
    int length = 100000,
  }) {
    final random = Random();
    final now = DateTime.now();
    final initialSentAt = now.subtract(Duration(days: 300));

    return List.generate(length, (index) {
      return Message(
        id: from + index + 1,
        body: random.nextBool()
            ? createSentence()
            : 'הראשי לימודים ב שתי, ב ובמתן הבהרה המקובל מלא. זאת גם מרצועת הספרות, מה היא כלליים קלאסיים. אחר דת באגים ולחבר. כלל את ריקוד קולנוע העברית, נפלו פולנית קצרמרים דת לוח, ויש או אחרים בקרבת המדינה.',
        from: random.nextInt(3) + 1,
        sentAt: initialSentAt.add(Duration(hours: (from + index))),
        state: MessageState.values[random.nextInt(2)],
      );
    });
  }

  Iterable<Participant> _generateParticipants() {
    return [
      Participant(
        id: 1,
        name: 'רוני אלמוני',
        isMyself: true,
      ),
      Participant(
        id: 2,
        name: 'ישראל ישראלי',
      ),
      Participant(
        id: 3,
        name: 'Third Participant',
      ),
    ];
  }
}