diff --git a/lib/main.dart b/lib/main.dart index 9a6e7d55..6fd9eebc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -169,7 +169,7 @@ class FlwtchState extends State { var args = jsonDecode(call.arguments); var profile = profs.getProfile(args["ProfileOnion"])!; var convo = profile.contactList.getContact(args["Handle"])!; - var initialIndex = convo.unreadMessages; + Provider.of(navKey.currentContext!, listen: false).initialScrollIndex = convo.unreadMessages; convo.unreadMessages = 0; // single pane mode pushes; double pane mode reads AppState.selectedProfile/Conversation @@ -187,7 +187,7 @@ class FlwtchState extends State { ChangeNotifierProvider.value(value: profile), ChangeNotifierProvider.value(value: convo), ], - builder: (context, child) => MessageView(initialIndex), + builder: (context, child) => MessageView(), ); }, ), diff --git a/lib/model.dart b/lib/model.dart index 39fe3e3a..75b39197 100644 --- a/lib/model.dart +++ b/lib/model.dart @@ -30,6 +30,7 @@ class AppState extends ChangeNotifier { String appError = ""; String? _selectedProfile; String? _selectedConversation; + int _initialScrollIndex = 0; int? _selectedIndex; bool _unreadMessagesBelow = false; @@ -67,6 +68,12 @@ class AppState extends ChangeNotifier { notifyListeners(); } + int get initialScrollIndex => _initialScrollIndex; + set initialScrollIndex(int newVal) { + this._initialScrollIndex = newVal; + notifyListeners(); + } + bool isLandscape(BuildContext c) => MediaQuery.of(c).size.width > MediaQuery.of(c).size.height; } diff --git a/lib/views/contactsview.dart b/lib/views/contactsview.dart index dbb59909..5bd3897d 100644 --- a/lib/views/contactsview.dart +++ b/lib/views/contactsview.dart @@ -23,18 +23,19 @@ class ContactsView extends StatefulWidget { // selectConversation can be called from anywhere to set the active conversation void selectConversation(BuildContext context, String handle) { - var initialIndex = Provider.of(context, listen: false).contactList.getContact(handle)!.unreadMessages; // requery instead of using contactinfostate directly because sometimes listview gets confused about data that resorts + var initialIndex = Provider.of(context, listen: false).contactList.getContact(handle)!.unreadMessages; Provider.of(context, listen: false).contactList.getContact(handle)!.unreadMessages = 0; // triggers update in Double/TripleColumnView + Provider.of(context, listen: false).initialScrollIndex = initialIndex; Provider.of(context, listen: false).selectedConversation = handle; Provider.of(context, listen: false).selectedIndex = null; // if in singlepane mode, push to the stack var isLandscape = Provider.of(context, listen: false).isLandscape(context); - if (Provider.of(context, listen: false).uiColumns(isLandscape).length == 1) _pushMessageView(context, handle, initialIndex); + if (Provider.of(context, listen: false).uiColumns(isLandscape).length == 1) _pushMessageView(context, handle); } -void _pushMessageView(BuildContext context, String handle, int initialIndex) { +void _pushMessageView(BuildContext context, String handle) { var profileOnion = Provider.of(context, listen: false).onion; Navigator.of(context).push( MaterialPageRoute( @@ -47,7 +48,7 @@ void _pushMessageView(BuildContext context, String handle, int initialIndex) { ChangeNotifierProvider.value(value: profile), ChangeNotifierProvider.value(value: profile.contactList.getContact(handle)!), ], - builder: (context, child) => MessageView(initialIndex), + builder: (context, child) => MessageView(), ); }, ), diff --git a/lib/views/doublecolview.dart b/lib/views/doublecolview.dart index 9e163b74..ebd7ffff 100644 --- a/lib/views/doublecolview.dart +++ b/lib/views/doublecolview.dart @@ -17,7 +17,6 @@ class _DoubleColumnViewState extends State { Widget build(BuildContext context) { var flwtch = Provider.of(context); var cols = Provider.of(context).uiColumns(true); - var initialIndex = flwtch.selectedConversation == null ? 0 : Provider.of(context, listen: false).contactList.getContact(flwtch.selectedConversation!)!.unreadMessages; return Flex( direction: Axis.horizontal, children: [ @@ -36,7 +35,7 @@ class _DoubleColumnViewState extends State { ChangeNotifierProvider.value(value: Provider.of(context)), ChangeNotifierProvider.value( value: flwtch.selectedConversation != null ? Provider.of(context).contactList.getContact(flwtch.selectedConversation!)! : ContactInfoState("", "")), - ], child: Container(child: MessageView(initialIndex))), + ], child: Container(child: MessageView())), ), ], ); diff --git a/lib/views/messageview.dart b/lib/views/messageview.dart index b1bb5f09..03cabd7d 100644 --- a/lib/views/messageview.dart +++ b/lib/views/messageview.dart @@ -22,9 +22,6 @@ import '../widgets/messagelist.dart'; import 'groupsettingsview.dart'; class MessageView extends StatefulWidget { - int initialIndex; - MessageView(this.initialIndex); - @override _MessageViewState createState() => _MessageViewState(); } @@ -38,24 +35,31 @@ class _MessageViewState extends State { @override void initState() { - // using "8" because "# of messages that fit on one screen" isnt trivial to calculate at this point - if (widget.initialIndex > 8) { - WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) { - Provider.of(context, listen: false).unreadMessagesBelow = true; - }); - } - scrollListener.itemPositions.addListener(() { var first = scrollListener.itemPositions.value.first.index; var last = scrollListener.itemPositions.value.last.index; // sometimes these go hi->lo and sometimes they go lo->hi because [who tf knows] - if (first == 0 || last == 0) { + if ((first == 0 || last == 0) && Provider.of(context, listen: false).unreadMessagesBelow == true) { + Provider.of(context, listen: false).initialScrollIndex = 0; Provider.of(context, listen: false).unreadMessagesBelow = false; } }); super.initState(); } + @override + void didChangeDependencies() { + var appState = Provider.of(context, listen: false); + + // using "8" because "# of messages that fit on one screen" isnt trivial to calculate at this point + if (appState.initialScrollIndex > 8 && appState.unreadMessagesBelow == false) { + WidgetsFlutterBinding.ensureInitialized().addPostFrameCallback((timeStamp) { + appState.unreadMessagesBelow = true; + }); + } + super.didChangeDependencies(); + } + @override void dispose() { focusNode.dispose(); @@ -107,7 +111,7 @@ class _MessageViewState extends State { onPressed: _pushContactSettings), ], ), - body: Padding(padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 108.0), child: MessageList(widget.initialIndex, scrollController, scrollListener)), + body: Padding(padding: EdgeInsets.fromLTRB(8.0, 8.0, 8.0, 108.0), child: MessageList(scrollController, scrollListener)), bottomSheet: _buildComposeBox(), )); } diff --git a/lib/views/triplecolview.dart b/lib/views/triplecolview.dart index b666e9b1..4156c738 100644 --- a/lib/views/triplecolview.dart +++ b/lib/views/triplecolview.dart @@ -35,7 +35,7 @@ class _TripleColumnViewState extends State { child: appState.selectedConversation == null ? Center(child: Text(AppLocalizations.of(context)!.addContactFirst)) : //dev - Container(child: MessageView(0/*todo:setme*/)), + Container(child: MessageView()), ), ]); } diff --git a/lib/widgets/messagelist.dart b/lib/widgets/messagelist.dart index defa3a19..e6f8ab64 100644 --- a/lib/widgets/messagelist.dart +++ b/lib/widgets/messagelist.dart @@ -9,10 +9,9 @@ import '../model.dart'; import '../settings.dart'; class MessageList extends StatefulWidget { - int initialIndex; ItemScrollController scrollController; ItemPositionsListener scrollListener; - MessageList(this.initialIndex, this.scrollController, this.scrollListener); + MessageList(this.scrollController, this.scrollListener); @override _MessageListState createState() => _MessageListState(); @@ -21,6 +20,7 @@ class MessageList extends StatefulWidget { class _MessageListState extends State { @override Widget build(BuildContext outerContext) { + var initi = Provider.of(outerContext, listen: false).initialScrollIndex; bool isP2P = !Provider.of(context).isGroup; bool isGroupAndSyncing = Provider.of(context).isGroup == true && Provider.of(context).status == "Authenticated"; bool isGroupAndSynced = Provider.of(context).isGroup && Provider.of(context).status == "Synced"; @@ -72,7 +72,7 @@ class _MessageListState extends State { ? ScrollablePositionedList.builder( itemPositionsListener: widget.scrollListener, itemScrollController: widget.scrollController, - initialScrollIndex: widget.initialIndex, + initialScrollIndex: Provider.of(outerContext, listen: false).initialScrollIndex, itemCount: Provider.of(outerContext).totalMessages, reverse: true, // NOTE: There seems to be a bug in flutter that corrects the mouse wheel scroll, but not the drag direction... itemBuilder: (itemBuilderContext, index) {