Browse Source

change homelist UI

pull/18/head
Sun 4 years ago
parent
commit
99cc2b7421
  1. 16
      lib/apps/chat/list.dart
  2. 14
      lib/apps/service/list.dart
  3. 29
      lib/apps/service/models.dart
  4. 238
      lib/pages/home.dart
  5. 28
      lib/provider.dart
  6. 151
      lib/widgets/default_home_show.dart

16
lib/apps/chat/list.dart

@ -23,13 +23,27 @@ class _ChatListState extends State<ChatList> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final provider = context.watch<ChatProvider>(); final provider = context.watch<ChatProvider>();
final isDesktop = isDisplayDesktop(context); final isDesktop = isDisplayDesktop(context);
final lang = AppLocalizations.of(context);
final color = Theme.of(context).colorScheme;
final friends = provider.friends; final friends = provider.friends;
final chatKeys = provider.orderKeys; final chatKeys = provider.orderKeys;
return Scaffold( return Scaffold(
body: ListView.builder( appBar: AppBar(
title: Text(lang.contact),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: ListView.builder(
itemCount: chatKeys.length, itemCount: chatKeys.length,
itemBuilder: (BuildContext ctx, int index) => ListChat(friend: friends[chatKeys[index]]), itemBuilder: (BuildContext ctx, int index) => ListChat(friend: friends[chatKeys[index]]),
)
),
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () { onPressed: () {

14
lib/apps/service/list.dart

@ -39,7 +39,7 @@ class _ServiceListState extends State<ServiceList> {
name: params[0], name: params[0],
bio: params[1], bio: params[1],
logo: params[2], logo: params[2],
callback: () => v.callback(context, isDesktop, lang), callback: () => v.callback(),
isDesktop: isDesktop, isDesktop: isDesktop,
); );
}).toList() }).toList()
@ -70,16 +70,12 @@ class ListInnerService extends StatelessWidget {
return GestureDetector( return GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () {
final widgets = this.callback(); final widget = this.callback();
if (widgets != null) { if (widget != null) {
if (this.isDesktop) { if (this.isDesktop) {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(widgets[0], widgets[1], widgets[2]); Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(widget);
} else { } else {
if (widgets[2] != null) { Navigator.push(context, MaterialPageRoute(builder: (_) => widget));
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(null, widgets[1], widgets[2]);
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => widgets[0]));
}
} }
} }
}, },

29
lib/apps/service/models.dart

@ -1,14 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:esse/l10n/localizations.dart'; import 'package:esse/l10n/localizations.dart';
import 'package:esse/provider.dart';
import 'package:esse/apps/assistant/page.dart'; import 'package:esse/apps/assistant/page.dart';
import 'package:esse/apps/file/page.dart'; import 'package:esse/apps/file/page.dart';
import 'package:esse/apps/group_chat/page.dart'; import 'package:esse/apps/group_chat/page.dart';
enum InnerService { enum InnerService {
Files, Files,
Assistant, Assistant,
@ -27,31 +23,14 @@ extension InnerServiceExtension on InnerService {
} }
} }
void callback(context, isDesktop, lang) { Widget callback() {
Widget coreWidget = null;
String listTitle = null;
Widget listHome = null;
switch (this) { switch (this) {
case InnerService.Files: case InnerService.Files:
listTitle = lang.files; return FolderList();
listHome = FolderList();
break;
case InnerService.Assistant: case InnerService.Assistant:
coreWidget = AssistantDetail(); return AssistantDetail();
break;
case InnerService.GroupChat: case InnerService.GroupChat:
listTitle = lang.groupChat; return GroupChatList();
listHome = GroupChatList();
break;
}
if (this == InnerService.Assistant) {
Navigator.push(context, MaterialPageRoute(builder: (_) => coreWidget));
} else {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(
coreWidget, listTitle, listHome
);
} }
} }
} }

238
lib/pages/home.dart

@ -22,16 +22,20 @@ import 'package:esse/account.dart';
import 'package:esse/global.dart'; import 'package:esse/global.dart';
import 'package:esse/options.dart'; import 'package:esse/options.dart';
import 'package:esse/provider.dart'; import 'package:esse/provider.dart';
import 'package:esse/session.dart';
import 'package:esse/apps/device/provider.dart'; import 'package:esse/apps/device/provider.dart';
import 'package:esse/apps/device/page.dart'; import 'package:esse/apps/device/page.dart';
import 'package:esse/apps/chat/provider.dart'; import 'package:esse/apps/chat/provider.dart';
import 'package:esse/apps/chat/list.dart'; import 'package:esse/apps/chat/list.dart';
import 'package:esse/apps/chat/detail.dart';
import 'package:esse/apps/chat/add.dart'; import 'package:esse/apps/chat/add.dart';
import 'package:esse/apps/file/page.dart'; import 'package:esse/apps/file/page.dart';
import 'package:esse/apps/service/list.dart'; import 'package:esse/apps/service/list.dart';
import 'package:esse/apps/service/add.dart'; import 'package:esse/apps/service/add.dart';
import 'package:esse/apps/assistant/page.dart'; import 'package:esse/apps/assistant/page.dart';
import 'package:esse/apps/group_chat/detail.dart';
import 'package:esse/apps/group_chat/provider.dart';
class HomePage extends StatelessWidget { class HomePage extends StatelessWidget {
static GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); static GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
@ -47,19 +51,18 @@ class HomePage extends StatelessWidget {
if (isDesktop) { if (isDesktop) {
return WillPopScope( return WillPopScope(
onWillPop: () => onWillPop: () => SystemChannels.platform.invokeMethod('SystemNavigator.pop'),
SystemChannels.platform.invokeMethod('SystemNavigator.pop'),
child: Scaffold( child: Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
drawer: const DrawerWidget(), drawer: const DrawerWidget(),
drawerScrimColor: Color(0x26ADB0BB), drawerScrimColor: const Color(0x26ADB0BB),
body: SafeArea( body: SafeArea(
child: Row(children: [ child: Row(
Container( children: [
width: 375.0, Container(width: 375.0,
child: HomeList(_scaffoldKey), child: HomeList(scaffoldKey: _scaffoldKey),
), ),
SizedBox(width: 20.0), const SizedBox(width: 20.0),
Expanded(child: context.watch<AccountProvider>().coreShowWidget), Expanded(child: context.watch<AccountProvider>().coreShowWidget),
])), ])),
)); ));
@ -72,16 +75,15 @@ class HomePage extends StatelessWidget {
} }
return WillPopScope( return WillPopScope(
onWillPop: () => onWillPop: () => SystemChannels.platform.invokeMethod('SystemNavigator.pop'),
SystemChannels.platform.invokeMethod('SystemNavigator.pop'),
child: Scaffold( child: Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
drawer: const DrawerWidget(), drawer: const DrawerWidget(),
drawerScrimColor: Color(0x26ADB0BB), drawerScrimColor: const Color(0x26ADB0BB),
body: AnnotatedRegion<SystemUiOverlayStyle>( body: AnnotatedRegion<SystemUiOverlayStyle>(
value: style.copyWith(statusBarColor: colorScheme.background), value: style.copyWith(statusBarColor: colorScheme.background),
child: SafeArea( child: SafeArea(
child: HomeList(_scaffoldKey), child: HomeList(scaffoldKey: _scaffoldKey),
)), )),
)); ));
} }
@ -89,8 +91,8 @@ class HomePage extends StatelessWidget {
} }
class HomeList extends StatefulWidget { class HomeList extends StatefulWidget {
final GlobalKey<ScaffoldState> _scaffoldKey; final GlobalKey<ScaffoldState> scaffoldKey;
HomeList(this._scaffoldKey); const HomeList({Key key, this.scaffoldKey}) : super(key: key);
@override @override
_HomeListState createState() => _HomeListState(); _HomeListState createState() => _HomeListState();
@ -133,52 +135,42 @@ class _HomeListState extends State<HomeList> {
final color = Theme.of(context).colorScheme; final color = Theme.of(context).colorScheme;
final lang = AppLocalizations.of(context); final lang = AppLocalizations.of(context);
final provider = context.watch<AccountProvider>(); final provider = context.watch<AccountProvider>();
final allKeys = provider.topKeys + provider.orderKeys;
final sessions = provider.sessions;
return Padding( return Scaffold(
padding: const EdgeInsets.symmetric(vertical: 10.0), appBar: AppBar(
child: Column( leading: IconButton(
children: [ icon: const Icon(Icons.menu),
Container( onPressed: () => widget.scaffoldKey.currentState.openDrawer(),
height: 30.0,
padding: const EdgeInsets.symmetric(horizontal: 20.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
onTap: widget._scaffoldKey.currentState.openDrawer,
child: Icon(
Icons.menu_rounded,
color: color.primary,
size: 28.0,
), ),
bottom: PreferredSize(
child: Container(color: const Color(0x40ADB0BB), height: 1.0),
preferredSize: Size.fromHeight(1.0)
),
actions: [
IconButton(
icon: const Icon(Icons.search),
onPressed: null,
), ),
Expanded(
child: Center(
child: Text(provider.homeShowTitle, style: TextStyle(fontWeight: FontWeight.bold)),
)),
Icon(Icons.search_rounded, color: color.primary),
const SizedBox(width: 20.0),
Stack(
children: <Widget>[
Container( Container(
width: 28.0, margin: const EdgeInsets.symmetric(horizontal: 20.0),
height: 28.0, alignment: Alignment.center,
child: provider.homeShowTitle == '' child: Stack(
? PopupMenuButton<int>( children: <Widget>[
shape: RoundedRectangleBorder( PopupMenuButton<int>(
borderRadius: BorderRadius.circular(15)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
color: const Color(0xFFEDEDED), color: const Color(0xFFEDEDED),
child: Icon(Icons.add_circle_outline_rounded, child: Icon(Icons.add_circle_outline, color: color.primary),
color: color.primary),
onSelected: (int value) { onSelected: (int value) {
if (value == 0) { if (value == 0) {
_scanQr(isDesktop); _scanQr(isDesktop);
} else if (value == 1) { } else if (value == 1) {
final widget = ChatAddPage(); final widget = ChatAddPage();
provider.systemAppFriendAddNew = false;
if (isDesktop) { if (isDesktop) {
provider.updateActivedWidget(widget); provider.updateActivedWidget(widget);
} else { } else {
provider.systemAppFriendAddNew = false;
setState(() {}); setState(() {});
Navigator.push(context, MaterialPageRoute(builder: (_) => widget)); Navigator.push(context, MaterialPageRoute(builder: (_) => widget));
} }
@ -203,9 +195,7 @@ class _HomeListState extends State<HomeList> {
_menuItem(2, Icons.qr_code_rounded, lang.myQrcode), _menuItem(2, Icons.qr_code_rounded, lang.myQrcode),
]; ];
}, },
) ),
: GestureDetector(onTap: () => provider.updateToHome(),
child: Icon(Icons.home_outlined, color: color.primary))),
if (provider.systemAppFriendAddNew) if (provider.systemAppFriendAddNew)
Positioned( Positioned(
top: 0, top: 0,
@ -219,16 +209,19 @@ class _HomeListState extends State<HomeList> {
))), ))),
], ],
), ),
], )
]
),
body: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 10.0),
child: ListView.builder(
itemCount: allKeys.length,
itemBuilder: (BuildContext ctx, int index) => _SessionWidget(
session: sessions[allKeys[index]]
),
), ),
), ),
const SizedBox(height: 10.0),
const Divider(height: 1.0, color: Color(0x40ADB0BB)),
const SizedBox(height: 5.0),
Expanded(
child: provider.homeShowWidget,
)
],
), ),
); );
} }
@ -359,9 +352,15 @@ class DrawerWidget extends StatelessWidget {
style: TextStyle(fontSize: 16.0)), style: TextStyle(fontSize: 16.0)),
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
final coreWidget = ChatList();
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget( Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(
null, lang.contact, ChatList() coreWidget
); );
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => coreWidget));
}
}), }),
ListTile( ListTile(
leading: Icon(Icons.grid_view_rounded, color: color.primary), leading: Icon(Icons.grid_view_rounded, color: color.primary),
@ -369,9 +368,14 @@ class DrawerWidget extends StatelessWidget {
style: TextStyle(fontSize: 16.0)), style: TextStyle(fontSize: 16.0)),
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
final coreWidget = ServiceList();
if (isDesktop) {
Provider.of<AccountProvider>(context, listen: false).updateActivedWidget( Provider.of<AccountProvider>(context, listen: false).updateActivedWidget(
null, lang.groups, ServiceList() coreWidget
); );
} else {
Navigator.push(context, MaterialPageRoute(builder: (_) => coreWidget));
}
}), }),
const Divider(height: 1.0, color: Color(0x40ADB0BB)), const Divider(height: 1.0, color: Color(0x40ADB0BB)),
ListTile( ListTile(
@ -459,6 +463,120 @@ class DrawerWidget extends StatelessWidget {
} }
} }
class _SessionWidget extends StatelessWidget {
final Session session;
const _SessionWidget({Key key, this.session}) : super(key: key);
@override
Widget build(BuildContext context) {
final color = Theme.of(context).colorScheme;
final lang = AppLocalizations.of(context);
final isDesktop = isDisplayDesktop(context);
final params = session.parse(lang);
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Widget coreWidget = null;
switch (session.type) {
case SessionType.Chat:
context.read<ChatProvider>().updateActivedFriend(session.fid);
coreWidget = ChatDetail();
break;
case SessionType.Group:
context.read<GroupChatProvider>().updateActivedGroup(session.fid);
coreWidget = GroupChatDetail();
break;
case SessionType.Assistant:
coreWidget = AssistantDetail();
break;
case SessionType.Files:
coreWidget = FolderList();
break;
}
context.read<AccountProvider>().updateActivedSession(session.id);
if (coreWidget != null) {
if (!isDesktop) {
Navigator.push(context, MaterialPageRoute(builder: (_) => coreWidget));
} else {
context.read<AccountProvider>().updateActivedWidget(coreWidget);
}
}
},
child: Container(
height: 55.0,
child: Row(
children: [
Container(
width: 45.0,
height: 45.0,
margin: const EdgeInsets.only(left: 20.0, right: 15.0),
child: params[0],
),
Expanded(
child: Container(
height: 55.0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(params[1],
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 16.0))
),
Container(
margin: const EdgeInsets.only(left: 15.0, right: 20.0),
child: Text(params[3], style: const TextStyle(color: Color(0xFFADB0BB), fontSize: 12.0)),
)
]),
const SizedBox(height: 4.0),
Row(
children: [
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
if (params[4] != null)
Container(
margin: const EdgeInsets.only(right: 6.0),
child: Icon(params[4], size: 16.0, color: Color(0xFFADB0BB)),
),
Expanded(
child: Text(params[2],
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(color: Color(0xFFADB0BB), fontSize: 12.0)),
)
]
),
),
Container(width: 8.0, height: 8.0,
margin: const EdgeInsets.only(left: 15.0, right: 20.0),
decoration: BoxDecoration(
color: session.lastReaded ? color.background : Colors.red,
shape: BoxShape.circle
),
),
]),
],
),
),
),
],
),
),
);
}
}
Widget _menuItem(int value, IconData icon, String text, Widget _menuItem(int value, IconData icon, String text,
[bool hasNew = false]) { [bool hasNew = false]) {
return PopupMenuItem<int>( return PopupMenuItem<int>(

28
lib/provider.dart

@ -7,7 +7,6 @@ import 'package:flutter/material.dart';
import 'package:esse/account.dart'; import 'package:esse/account.dart';
import 'package:esse/utils/logined_cache.dart'; import 'package:esse/utils/logined_cache.dart';
import 'package:esse/widgets/default_core_show.dart'; import 'package:esse/widgets/default_core_show.dart';
import 'package:esse/widgets/default_home_show.dart';
import 'package:esse/global.dart'; import 'package:esse/global.dart';
import 'package:esse/rpc.dart'; import 'package:esse/rpc.dart';
import 'package:esse/session.dart'; import 'package:esse/session.dart';
@ -35,12 +34,6 @@ class AccountProvider extends ChangeNotifier {
int actived = 0; int actived = 0;
Session get activedSession => this.sessions[actived]; Session get activedSession => this.sessions[actived];
/// left home list sessions widget.
String homeShowTitle = '';
Widget defaultListShow = DefaultHomeShow();
Widget currentListShow = null;
Widget get homeShowWidget => this.currentListShow ?? this.defaultListShow;
/// right main screen show session details. /// right main screen show session details.
Widget coreShowWidget = DefaultCoreShow(); Widget coreShowWidget = DefaultCoreShow();
@ -120,7 +113,6 @@ class AccountProvider extends ChangeNotifier {
this.activedAccountId = gid; this.activedAccountId = gid;
this.activedAccount.hasNew = false; this.activedAccount.hasNew = false;
this.coreShowWidget = DefaultCoreShow(); this.coreShowWidget = DefaultCoreShow();
this.currentListShow = null;
// load sessions. // load sessions.
this.sessions.clear(); this.sessions.clear();
@ -141,7 +133,6 @@ class AccountProvider extends ChangeNotifier {
logout() { logout() {
this.accounts.clear(); this.accounts.clear();
this.clearActivedAccount(); this.clearActivedAccount();
this.currentListShow = null;
this.sessions.clear(); this.sessions.clear();
this.orderKeys.clear(); this.orderKeys.clear();
this.topKeys.clear(); this.topKeys.clear();
@ -201,12 +192,6 @@ class AccountProvider extends ChangeNotifier {
rpc.send('account-system-info', []); rpc.send('account-system-info', []);
} }
updateToHome() {
this.homeShowTitle = '';
this.currentListShow = null;
notifyListeners();
}
clearActivedSession(SessionType type) { clearActivedSession(SessionType type) {
if (this.activedSession.type == type && this.actived > 0) { if (this.activedSession.type == type && this.actived > 0) {
rpc.send('session-suspend', [this.actived, this.activedSession.gid, rpc.send('session-suspend', [this.actived, this.activedSession.gid,
@ -254,20 +239,13 @@ class AccountProvider extends ChangeNotifier {
} }
} }
updateActivedWidget([Widget coreWidget, String title, Widget homeWidget]) { updateActivedWidget(Widget coreWidget) {
print("update actived widget");
if (homeWidget != null && title != null) {
this.homeShowTitle = title;
this.currentListShow = homeWidget;
}
if (coreWidget != null) { if (coreWidget != null) {
print("update actived widget");
this.coreShowWidget = coreWidget; this.coreShowWidget = coreWidget;
}
this.systemAppFriendAddNew = false;
notifyListeners(); notifyListeners();
} }
}
// -- callback when receive rpc info. -- // // -- callback when receive rpc info. -- //
_systemInfo(List params) { _systemInfo(List params) {

151
lib/widgets/default_home_show.dart

@ -1,151 +0,0 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:esse/l10n/localizations.dart';
import 'package:esse/utils/adaptive.dart';
import 'package:esse/widgets/list_system_app.dart';
import 'package:esse/options.dart';
import 'package:esse/provider.dart';
import 'package:esse/session.dart';
import 'package:esse/apps/chat/detail.dart';
import 'package:esse/apps/chat/provider.dart';
import 'package:esse/apps/group_chat/detail.dart';
import 'package:esse/apps/group_chat/provider.dart';
import 'package:esse/apps/assistant/page.dart';
import 'package:esse/apps/file/page.dart';
class DefaultHomeShow extends StatelessWidget {
const DefaultHomeShow({Key key}): super(key: key);
@override
Widget build(BuildContext context) {
final isDesktop = isDisplayDesktop(context);
final lang = AppLocalizations.of(context);
final provider = context.watch<AccountProvider>();
final allKeys = provider.topKeys + provider.orderKeys;
final sessions = provider.sessions;
return ListView.builder(
itemCount: allKeys.length,
itemBuilder: (BuildContext ctx, int index) => _SessionWidget(
session: sessions[allKeys[index]]
),
);
}
}
class _SessionWidget extends StatelessWidget {
final Session session;
const _SessionWidget({Key key, this.session}) : super(key: key);
@override
Widget build(BuildContext context) {
final color = Theme.of(context).colorScheme;
final lang = AppLocalizations.of(context);
final isDesktop = isDisplayDesktop(context);
final params = session.parse(lang);
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
String listTitle = "";
Widget listWidget = null;
Widget coreWidget = null;
switch (session.type) {
case SessionType.Chat:
context.read<ChatProvider>().updateActivedFriend(session.fid);
coreWidget = ChatDetail();
break;
case SessionType.Group:
context.read<GroupChatProvider>().updateActivedGroup(session.fid);
coreWidget = GroupChatDetail();
break;
case SessionType.Assistant:
coreWidget = AssistantDetail();
break;
case SessionType.Files:
listTitle = lang.files;
listWidget = FolderList();
break;
}
context.read<AccountProvider>().updateActivedSession(session.id);
if (!isDesktop && coreWidget != null) {
Navigator.push(context, MaterialPageRoute(builder: (_) => coreWidget));
} else {
context.read<AccountProvider>().updateActivedWidget(coreWidget, listTitle, listWidget);
}
},
child: Container(
height: 55.0,
child: Row(
children: [
Container(
width: 45.0,
height: 45.0,
margin: const EdgeInsets.only(left: 20.0, right: 15.0),
child: params[0],
),
Expanded(
child: Container(
height: 55.0,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(params[1],
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 16.0))
),
Container(
margin: const EdgeInsets.only(left: 15.0, right: 20.0),
child: Text(params[3], style: const TextStyle(color: Color(0xFFADB0BB), fontSize: 12.0)),
)
]),
const SizedBox(height: 4.0),
Row(
children: [
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
if (params[4] != null)
Container(
margin: const EdgeInsets.only(right: 6.0),
child: Icon(params[4], size: 16.0, color: Color(0xFFADB0BB)),
),
Expanded(
child: Text(params[2],
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: const TextStyle(color: Color(0xFFADB0BB), fontSize: 12.0)),
)
]
),
),
Container(width: 8.0, height: 8.0,
margin: const EdgeInsets.only(left: 15.0, right: 20.0),
decoration: BoxDecoration(
color: session.lastReaded ? color.background : Colors.red,
shape: BoxShape.circle
),
),
]),
],
),
),
),
],
),
),
);
}
}
Loading…
Cancel
Save