4
2
Fork 0

reactive pull conversation data from database - fixes #14

pull/31/head
Sudharshan S. 2019-02-17 17:57:55 +08:00
parent 76d163d817
commit 5336dea438
Signed by: sudharshan
GPG Key ID: C861C97AAF3D9559
4 changed files with 101 additions and 32 deletions

View File

@ -2,6 +2,7 @@ import "package:flutter/material.dart";
import "../../models/user_model.dart";
import "../../blocs/contact_bloc.dart";
import "contact_item.dart";
class ContactList extends StatefulWidget {

View File

@ -1,8 +1,40 @@
import "package:flutter/material.dart";
import "../../models/user_model.dart";
import "../../models/conversation_model.dart";
import "../../blocs/conversation_bloc.dart";
import "user_avatar.dart";
class ConversationItem extends StatelessWidget {
class ConversationItem extends StatefulWidget {
final Conversation conversation;
ConversationItem({@required this.conversation});
@override
State<StatefulWidget> createState() {
return _ConversationItemState(conversation: conversation);
}
}
class _ConversationItemState extends State<ConversationItem> {
final bloc;
final Conversation conversation;
_ConversationItemState({@required this.conversation})
: bloc = ConversationMembersBloc(conversation.id);
@override
void initState() {
super.initState();
bloc.fetchConversationMembers();
}
@override
void dispose() {
bloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ListTile(
@ -10,7 +42,7 @@ class ConversationItem extends StatelessWidget {
onTap: () => {},
contentPadding:
EdgeInsets.only(top: 0.0, left: 20.0, right: 20.0, bottom: 0.0),
title: Text("Family Chat", style: Theme.of(context).textTheme.title),
title: Text(conversation.title, style: Theme.of(context).textTheme.title),
subtitle: Text("Mum I might have forgotten to close the windows",
maxLines: 2,
overflow: TextOverflow.ellipsis,
@ -23,25 +55,28 @@ class ConversationItem extends StatelessWidget {
style: Theme.of(context).primaryTextTheme.body1.copyWith(
fontWeight: FontWeight.w700,
color: Theme.of(context).primaryColorDark)),
Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
UserAvatar(
padding: EdgeInsets.only(top: 10.0, left: 1.0),
active: true,
name: "IT"),
UserAvatar(
padding: EdgeInsets.only(top: 10.0, left: 10.0),
active: true,
name: "AM"),
UserAvatar(
padding: EdgeInsets.only(top: 10.0, left: 10.0),
active: false,
name: "SU"),
])
StreamBuilder(
stream: bloc.members,
builder: (context, AsyncSnapshot<List<User>> snapshot) {
if (snapshot.hasData) {
return membersBuilder(snapshot.data);
} else if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Center(child: CircularProgressIndicator());
}),
]),
);
}
Widget membersBuilder(List<User> data) {
return Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: data
.map((user) => UserAvatar(
padding: EdgeInsets.only(top: 10.0, left: 1.0), user: user))
.toList());
}
}

View File

@ -1,19 +1,52 @@
import "package:flutter/material.dart";
import "../../models/conversation_model.dart";
import "../../blocs/conversation_bloc.dart";
import "conversation_item.dart";
class ConversationList extends StatelessWidget {
final List<String> items;
class ConversationList extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _ConversationListState();
}
}
ConversationList({Key key, @required this.items}) : super(key: key);
class _ConversationListState extends State<ConversationList> {
final bloc = ConversationsBloc();
@override
initState() {
super.initState();
bloc.fetchConversations();
}
@override
dispose() {
bloc.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: bloc.conversations,
builder: (context, AsyncSnapshot<List<Conversation>> snapshot) {
if (snapshot.hasData) {
return buildList(snapshot.data);
} else if (snapshot.hasError) {
return Text(snapshot.error.toString());
}
return Center(child: CircularProgressIndicator());
});
}
Widget buildList(List<Conversation> data) {
return ListView.builder(
padding: EdgeInsets.only(top: 0.0),
itemCount: items.length,
itemCount: data.length,
itemBuilder: (context, index) {
return ConversationItem();
return ConversationItem(conversation: data[index]);
},
);
}

View File

@ -1,14 +1,14 @@
import "package:flutter/material.dart";
import "../../models/user_model.dart";
class UserAvatar extends StatelessWidget {
final bool active;
final String name;
final User user;
final EdgeInsetsGeometry padding;
final double radius;
UserAvatar(
{@required this.active,
@required this.name,
{@required this.user,
this.padding: const EdgeInsets.all(0.0),
this.radius: 20.0});
@ -19,16 +19,16 @@ class UserAvatar extends StatelessWidget {
child: Stack(alignment: Alignment.bottomRight, children: <Widget>[
CircleAvatar(
backgroundColor: Colors.brown.shade800,
child: Text(name),
child: Text(user.firstName[0] + user.lastName[0]),
radius: radius),
active
/*active
? Container(
width: 12.0,
height: 12.0,
decoration: BoxDecoration(
color: Theme.of(context).indicatorColor,
shape: BoxShape.circle))
: Container(),
: Container(),*/
]));
}
}