feat: custom avatar builder

This commit is contained in:
Stein Milder 2022-11-24 15:52:36 +01:00
parent 0caebe7d02
commit f110c224a2
5 changed files with 42 additions and 35 deletions

View file

@ -8,13 +8,13 @@ import 'package:flutter_community_chat_view/src/components/chat_image.dart';
class ChatRow extends StatelessWidget { class ChatRow extends StatelessWidget {
const ChatRow({ const ChatRow({
required this.title, required this.title,
this.image,
this.lastUsed, this.lastUsed,
this.subTitle, this.subTitle,
this.avatar,
super.key, super.key,
}); });
final String title; final String title;
final String? image; final Widget? avatar;
final String? subTitle; final String? subTitle;
final String? lastUsed; final String? lastUsed;
@ -24,7 +24,7 @@ class ChatRow extends StatelessWidget {
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.only(left: 10.0), padding: const EdgeInsets.only(left: 10.0),
child: ChatImage(image: image), child: avatar,
), ),
Expanded( Expanded(
child: Padding( child: Padding(

View file

@ -3,7 +3,9 @@
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_community_chat_interface/flutter_community_chat_interface.dart';
import 'package:flutter_community_chat_view/flutter_community_chat_view.dart'; import 'package:flutter_community_chat_view/flutter_community_chat_view.dart';
import 'package:flutter_community_chat_view/src/components/chat_image.dart';
class ChatOptions { class ChatOptions {
const ChatOptions({ const ChatOptions({
@ -13,6 +15,7 @@ class ChatOptions {
this.imagePickerContainerBuilder = _createImagePickerContainer, this.imagePickerContainerBuilder = _createImagePickerContainer,
this.closeImagePickerButtonBuilder = _createCloseImagePickerButton, this.closeImagePickerButtonBuilder = _createCloseImagePickerButton,
this.scaffoldBuilder = _createScaffold, this.scaffoldBuilder = _createScaffold,
this.userAvatarBuilder = _createUserAvatar,
}); });
final ButtonBuilder newChatButtonBuilder; final ButtonBuilder newChatButtonBuilder;
@ -21,6 +24,7 @@ class ChatOptions {
final ContainerBuilder imagePickerContainerBuilder; final ContainerBuilder imagePickerContainerBuilder;
final ButtonBuilder closeImagePickerButtonBuilder; final ButtonBuilder closeImagePickerButtonBuilder;
final ScaffoldBuilder scaffoldBuilder; final ScaffoldBuilder scaffoldBuilder;
final UserAvatarBuilder userAvatarBuilder;
} }
Widget _createNewChatButton( Widget _createNewChatButton(
@ -93,6 +97,15 @@ Scaffold _createScaffold(
body: body, body: body,
); );
Widget _createUserAvatar(
ChatUserModel user,
double size,
) =>
ChatImage(
image: user.imageUrl,
size: size,
);
typedef ButtonBuilder = Widget Function( typedef ButtonBuilder = Widget Function(
BuildContext context, BuildContext context,
VoidCallback onPressed, VoidCallback onPressed,
@ -113,3 +126,8 @@ typedef ScaffoldBuilder = Scaffold Function(
AppBar appBar, AppBar appBar,
Widget body, Widget body,
); );
typedef UserAvatarBuilder = Widget Function(
ChatUserModel user,
double size,
);

View file

@ -7,7 +7,6 @@ import 'package:flutter_community_chat_interface/flutter_community_chat_interfac
import 'package:flutter_community_chat_view/flutter_community_chat_view.dart'; import 'package:flutter_community_chat_view/flutter_community_chat_view.dart';
import 'package:flutter_community_chat_view/src/components/chat_bottom.dart'; import 'package:flutter_community_chat_view/src/components/chat_bottom.dart';
import 'package:flutter_community_chat_view/src/components/chat_detail_row.dart'; import 'package:flutter_community_chat_view/src/components/chat_detail_row.dart';
import 'package:flutter_community_chat_view/src/components/chat_image.dart';
class ChatDetailScreen extends StatelessWidget { class ChatDetailScreen extends StatelessWidget {
const ChatDetailScreen({ const ChatDetailScreen({
@ -39,36 +38,20 @@ class ChatDetailScreen extends StatelessWidget {
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
if (chat is PersonalChatModel) ...[ if (chat is PersonalChatModel)
ChatImage( options.userAvatarBuilder(
image: (chat as PersonalChatModel).user.imageUrl, (chat as PersonalChatModel).user,
size: 36.0, 36.0,
), ),
Expanded( Expanded(
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 15.5), padding: const EdgeInsets.only(left: 15.5),
child: Text( child: Text(
(chat as PersonalChatModel).user.name ?? '', (chat as PersonalChatModel).user.name ?? '',
style: const TextStyle(fontSize: 18), style: const TextStyle(fontSize: 18),
),
), ),
), ),
], ),
if (chat is GroupChatModel) ...[
ChatImage(
image: (chat as GroupChatModel).imageUrl,
size: 36.0,
),
Expanded(
child: Padding(
padding: const EdgeInsets.only(left: 15.5),
child: Text(
(chat as GroupChatModel).title,
style: const TextStyle(fontSize: 18),
),
),
),
],
], ],
), ),
), ),

View file

@ -70,9 +70,12 @@ class _ChatScreenState extends State<ChatScreen> {
onTap: () => widget.onPressChat(chat), onTap: () => widget.onPressChat(chat),
child: widget.options.chatRowContainerBuilder( child: widget.options.chatRowContainerBuilder(
ChatRow( ChatRow(
image: chat is PersonalChatModel avatar: chat is PersonalChatModel
? chat.user.imageUrl ? widget.options.userAvatarBuilder(
: (chat as GroupChatModel).imageUrl, chat.user,
40.0,
)
: Container(),
title: chat is PersonalChatModel title: chat is PersonalChatModel
? chat.user.name ?? '' ? chat.user.name ?? ''
: (chat as GroupChatModel).title, : (chat as GroupChatModel).title,

View file

@ -82,7 +82,10 @@ class _NewChatScreenState extends State<NewChatScreen> {
GestureDetector( GestureDetector(
child: widget.options.chatRowContainerBuilder( child: widget.options.chatRowContainerBuilder(
ChatRow( ChatRow(
image: user.imageUrl, avatar: widget.options.userAvatarBuilder(
user,
40.0,
),
title: user.name ?? '', title: user.name ?? '',
), ),
), ),