add header

This commit is contained in:
Salvatore Giordano
2020-02-27 10:37:44 +01:00
parent 31357c56b9
commit f93430b11d
9 changed files with 127 additions and 17 deletions
+1
View File
@@ -47,6 +47,7 @@ class ChannelPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ChannelHeader(),
body: Column(
children: <Widget>[
Expanded(
@@ -65,6 +65,7 @@ class ChannelPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ChannelHeader(),
body: Column(
children: <Widget>[
Expanded(
+1
View File
@@ -47,6 +47,7 @@ class ChannelPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ChannelHeader(),
body: Column(
children: <Widget>[
Expanded(
+1
View File
@@ -38,6 +38,7 @@ class ChannelPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ChannelHeader(),
body: Column(
children: <Widget>[
Expanded(
+1
View File
@@ -47,6 +47,7 @@ class ChannelPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: ChannelHeader(),
body: Column(
children: <Widget>[
Expanded(
+94
View File
@@ -0,0 +1,94 @@
import 'package:flutter/material.dart';
import 'package:stream_chat/stream_chat.dart';
import 'package:stream_chat_flutter/src/channel_name.dart';
import 'package:timeago/timeago.dart' as timeago;
import './channel_name.dart';
import 'channel_image.dart';
import 'stream_channel.dart';
class ChannelHeader extends StatelessWidget implements PreferredSizeWidget {
final bool showBackButton;
final VoidCallback onBackPressed;
ChannelHeader({
Key key,
this.showBackButton = true,
this.onBackPressed,
}) : preferredSize = Size.fromHeight(kToolbarHeight),
super(key: key);
@override
Widget build(BuildContext context) {
final channel = StreamChannel.of(context).channel;
return AppBar(
leading: showBackButton ? _buildBackButton(context) : Container(),
actions: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 10.0),
child: Stack(
children: <Widget>[
Center(child: ChannelImage(channel: channel)),
],
),
),
],
centerTitle: true,
title: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
ChannelName(
channel: channel,
),
_buildLastActive(context, channel),
],
),
);
}
Widget _buildLastActive(BuildContext context, Channel channel) {
return StreamBuilder<DateTime>(
stream: channel.lastMessageAtStream,
initialData: channel.lastMessageAt,
builder: (context, snapshot) {
return (snapshot.data != null)
? Text(
'Active ${timeago.format(snapshot.data)}',
style: Theme.of(context).textTheme.caption,
)
: Container();
},
);
}
Padding _buildBackButton(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(14.0),
child: RawMaterialButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(4)),
elevation: 0,
highlightElevation: 0,
focusElevation: 0,
disabledElevation: 0,
hoverElevation: 0,
onPressed: () {
if (onBackPressed != null) {
onBackPressed();
} else {
Navigator.of(context).pop();
}
},
fillColor: Colors.black.withOpacity(.1),
padding: EdgeInsets.all(4),
child: Icon(
Icons.arrow_back_ios,
size: 15,
color: Colors.black,
),
),
);
}
@override
final Size preferredSize;
}
+16 -11
View File
@@ -14,16 +14,21 @@ class ChannelImage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return CircleAvatar(
radius: radius,
backgroundImage: channel.extraData?.containsKey('image') ?? false
? CachedNetworkImageProvider(channel.extraData['image'])
: null,
child: channel.extraData?.containsKey('image') ?? false
? null
: Text(channel.extraData?.containsKey('name') ?? false
? channel.extraData['name'][0]
: ''),
);
return StreamBuilder<Map<String, dynamic>>(
stream: channel.extraDataStream,
initialData: channel.extraData,
builder: (context, snapshot) {
return CircleAvatar(
radius: radius,
backgroundImage: snapshot.data?.containsKey('image') ?? false
? CachedNetworkImageProvider(snapshot.data['image'])
: null,
child: snapshot.data?.containsKey('image') ?? false
? null
: Text(snapshot.data?.containsKey('name') ?? false
? snapshot.data['name'][0]
: ''),
);
});
}
}
+11 -6
View File
@@ -11,11 +11,16 @@ class ChannelName extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text(
channel?.extraData != null
? (channel?.extraData['name'] ?? channel.cid)
: channel.cid,
style: Theme.of(context).textTheme.body2,
);
return StreamBuilder<Map<String, dynamic>>(
stream: channel.extraDataStream,
initialData: channel.extraData,
builder: (context, snapshot) {
return Text(
snapshot.data != null
? (snapshot.data['name'] ?? channel.cid)
: channel.cid,
style: Theme.of(context).textTheme.body2,
);
});
}
}
+1
View File
@@ -1,5 +1,6 @@
export 'package:stream_chat/stream_chat.dart';
export 'src/channel_header.dart';
export 'src/channel_image.dart';
export 'src/channel_list_view.dart';
export 'src/channel_name.dart';