+5
@@ -2,7 +2,12 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:shimmer/shimmer.dart';
|
import 'package:shimmer/shimmer.dart';
|
||||||
import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
|
import 'package:stream_chat_flutter/src/stream_chat_theme.dart';
|
||||||
|
|
||||||
|
/// A shimmering list item which shows a loading effect.
|
||||||
|
///
|
||||||
|
/// This is used by [StreamChannelListView] to show a loading effect while
|
||||||
|
/// the list is being loaded.
|
||||||
class StreamChannelListLoadingTile extends StatelessWidget {
|
class StreamChannelListLoadingTile extends StatelessWidget {
|
||||||
|
/// Creates a new instance of [StreamChannelListLoadingTile] widget.
|
||||||
const StreamChannelListLoadingTile({
|
const StreamChannelListLoadingTile({
|
||||||
Key? key,
|
Key? key,
|
||||||
this.visualDensity = VisualDensity.standard,
|
this.visualDensity = VisualDensity.standard,
|
||||||
|
|||||||
+23
-30
@@ -2,6 +2,7 @@ import 'package:collection/collection.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:jiffy/jiffy.dart';
|
import 'package:jiffy/jiffy.dart';
|
||||||
import 'package:stream_chat/stream_chat.dart' show Channel;
|
import 'package:stream_chat/stream_chat.dart' show Channel;
|
||||||
|
import 'package:stream_chat_flutter/src/extension.dart';
|
||||||
import 'package:stream_chat_flutter/src/sending_indicator.dart';
|
import 'package:stream_chat_flutter/src/sending_indicator.dart';
|
||||||
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
|
import 'package:stream_chat_flutter/src/stream_svg_icon.dart';
|
||||||
import 'package:stream_chat_flutter/src/theme/channel_preview_theme.dart';
|
import 'package:stream_chat_flutter/src/theme/channel_preview_theme.dart';
|
||||||
@@ -10,9 +11,20 @@ import 'package:stream_chat_flutter/src/unread_indicator.dart';
|
|||||||
import 'package:stream_chat_flutter/src/v4/stream_channel_avatar.dart';
|
import 'package:stream_chat_flutter/src/v4/stream_channel_avatar.dart';
|
||||||
import 'package:stream_chat_flutter/src/v4/stream_channel_name.dart';
|
import 'package:stream_chat_flutter/src/v4/stream_channel_name.dart';
|
||||||
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
|
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
|
||||||
import 'package:stream_chat_flutter/src/extension.dart';
|
|
||||||
|
|
||||||
|
/// A widget that displays a channel preview.
|
||||||
|
///
|
||||||
|
/// This widget is intended to be used as a Tile in [StreamChannelListView]
|
||||||
|
///
|
||||||
|
/// It shows the last message of the channel, the last message time, the unread
|
||||||
|
/// message count, the typing indicator, the sending indicator and the channel
|
||||||
|
/// avatar.
|
||||||
|
///
|
||||||
|
/// See also:
|
||||||
|
/// * [StreamChannelAvatar]
|
||||||
|
/// * [StreamChannelName]
|
||||||
class StreamChannelListTile extends StatelessWidget {
|
class StreamChannelListTile extends StatelessWidget {
|
||||||
|
/// Creates a new instance of [StreamChannelListTile] widget.
|
||||||
StreamChannelListTile({
|
StreamChannelListTile({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.channel,
|
required this.channel,
|
||||||
@@ -29,50 +41,22 @@ class StreamChannelListTile extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
/// The channel to display.
|
||||||
final Channel channel;
|
final Channel channel;
|
||||||
|
|
||||||
/// A widget to display before the title.
|
/// A widget to display before the title.
|
||||||
///
|
|
||||||
/// Typically an [Icon] or a [CircleAvatar] widget.
|
|
||||||
final Widget? leading;
|
final Widget? leading;
|
||||||
|
|
||||||
/// The primary content of the list tile.
|
/// The primary content of the list tile.
|
||||||
///
|
|
||||||
/// Typically a [Text] widget.
|
|
||||||
///
|
|
||||||
/// This should not wrap. To enforce the single line limit, use
|
|
||||||
/// [Text.maxLines].
|
|
||||||
final Widget? title;
|
final Widget? title;
|
||||||
|
|
||||||
/// Additional content displayed below the title.
|
/// Additional content displayed below the title.
|
||||||
///
|
|
||||||
/// Typically a [Text] widget.
|
|
||||||
///
|
|
||||||
/// If [isThreeLine] is false, this should not wrap.
|
|
||||||
///
|
|
||||||
/// If [isThreeLine] is true, this should be configured to take a maximum of
|
|
||||||
/// two lines. For example, you can use [Text.maxLines] to enforce the number
|
|
||||||
/// of lines.
|
|
||||||
///
|
|
||||||
/// The subtitle's default [TextStyle] depends on [TextTheme.bodyText2] except
|
|
||||||
/// [TextStyle.color]. The [TextStyle.color] depends on the value of [enabled]
|
|
||||||
/// and [selected].
|
|
||||||
///
|
|
||||||
/// When [enabled] is false, the text color is set to [ThemeData.disabledColor].
|
|
||||||
///
|
|
||||||
/// When [selected] is false, the text color is set to [ListTileTheme.textColor]
|
|
||||||
/// if it's not null and to [TextTheme.caption]'s color if [ListTileTheme.textColor]
|
|
||||||
/// is null.
|
|
||||||
final Widget? subtitle;
|
final Widget? subtitle;
|
||||||
|
|
||||||
/// Called when the user taps this list tile.
|
/// Called when the user taps this list tile.
|
||||||
///
|
|
||||||
/// Inoperative if [enabled] is false.
|
|
||||||
final GestureTapCallback? onTap;
|
final GestureTapCallback? onTap;
|
||||||
|
|
||||||
/// Called when the user long-presses on this list tile.
|
/// Called when the user long-presses on this list tile.
|
||||||
///
|
|
||||||
/// Inoperative if [enabled] is false.
|
|
||||||
final GestureLongPressCallback? onLongPress;
|
final GestureLongPressCallback? onLongPress;
|
||||||
|
|
||||||
/// Defines how compact the list tile's layout will be.
|
/// Defines how compact the list tile's layout will be.
|
||||||
@@ -196,7 +180,9 @@ class StreamChannelListTile extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A widget that displays the channel last message date.
|
||||||
class ChannelLastMessageDate extends StatelessWidget {
|
class ChannelLastMessageDate extends StatelessWidget {
|
||||||
|
/// Creates a new instance of the [ChannelLastMessageDate] widget.
|
||||||
ChannelLastMessageDate({
|
ChannelLastMessageDate({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.channel,
|
required this.channel,
|
||||||
@@ -207,6 +193,7 @@ class ChannelLastMessageDate extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
/// The channel to display the last message date for.
|
||||||
final Channel channel;
|
final Channel channel;
|
||||||
|
|
||||||
/// The style of the text displayed
|
/// The style of the text displayed
|
||||||
@@ -246,7 +233,9 @@ class ChannelLastMessageDate extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A widget that displays the subtitle for [StreamChannelListTile].
|
||||||
class ChannelListTileSubtitle extends StatelessWidget {
|
class ChannelListTileSubtitle extends StatelessWidget {
|
||||||
|
/// Creates a new instance of [StreamChannelListTileSubtitle] widget.
|
||||||
ChannelListTileSubtitle({
|
ChannelListTileSubtitle({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.channel,
|
required this.channel,
|
||||||
@@ -257,6 +246,7 @@ class ChannelListTileSubtitle extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
/// The channel to create the subtitle from.
|
||||||
final Channel channel;
|
final Channel channel;
|
||||||
|
|
||||||
/// The style of the text displayed
|
/// The style of the text displayed
|
||||||
@@ -287,7 +277,9 @@ class ChannelListTileSubtitle extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A widget that displays the last message of a channel.
|
||||||
class ChannelLastMessageText extends StatelessWidget {
|
class ChannelLastMessageText extends StatelessWidget {
|
||||||
|
/// Creates a new instance of [ChannelLastMessageText] widget.
|
||||||
ChannelLastMessageText({
|
ChannelLastMessageText({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.channel,
|
required this.channel,
|
||||||
@@ -298,6 +290,7 @@ class ChannelLastMessageText extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
/// The channel to display the last message of.
|
||||||
final Channel channel;
|
final Channel channel;
|
||||||
|
|
||||||
/// The style of the text displayed
|
/// The style of the text displayed
|
||||||
|
|||||||
+6
-3
@@ -10,9 +10,12 @@ import 'package:stream_chat_flutter/src/v4/channel_list_view/stream_channel_list
|
|||||||
import 'package:stream_chat_flutter/src/v4/channel_list_view/stream_channel_list_tile.dart';
|
import 'package:stream_chat_flutter/src/v4/channel_list_view/stream_channel_list_tile.dart';
|
||||||
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
|
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
|
||||||
|
|
||||||
Widget defaultSeparatorBuilder(context, index) =>
|
/// Default separator builder for [StreamChannelListView].
|
||||||
|
Widget defaultSeparatorBuilder(BuildContext context, int index) =>
|
||||||
const StreamChannelListSeparator();
|
const StreamChannelListSeparator();
|
||||||
|
|
||||||
|
/// Signature for the item builder that creates the children of the
|
||||||
|
/// [StreamChannelListView].
|
||||||
typedef StreamChannelListViewItemBuilder = Widget Function(
|
typedef StreamChannelListViewItemBuilder = Widget Function(
|
||||||
BuildContext context,
|
BuildContext context,
|
||||||
Channel channel,
|
Channel channel,
|
||||||
@@ -265,13 +268,13 @@ class _StreamChannelListViewState extends State<StreamChannelListView> {
|
|||||||
separatorBuilder: widget.separatorBuilder,
|
separatorBuilder: widget.separatorBuilder,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
if (!_hasRequestedNextPage) {
|
if (!_hasRequestedNextPage) {
|
||||||
final newPageRequestTriggerIndex = value.itemCount - 3;
|
final newPageRequestTriggerIndex = channels.length - 3;
|
||||||
final isBuildingTriggerIndexItem =
|
final isBuildingTriggerIndexItem =
|
||||||
index == newPageRequestTriggerIndex;
|
index == newPageRequestTriggerIndex;
|
||||||
if (nextPageKey != null && isBuildingTriggerIndexItem) {
|
if (nextPageKey != null && isBuildingTriggerIndexItem) {
|
||||||
// Schedules the request for the end of this frame.
|
// Schedules the request for the end of this frame.
|
||||||
WidgetsBinding.instance?.addPostFrameCallback((_) async {
|
WidgetsBinding.instance?.addPostFrameCallback((_) async {
|
||||||
if (!value.hasError) {
|
if (error == null) {
|
||||||
await _controller.loadMore(nextPageKey);
|
await _controller.loadMore(nextPageKey);
|
||||||
}
|
}
|
||||||
_hasRequestedNextPage = false;
|
_hasRequestedNextPage = false;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ class StreamChannelName extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
super(key: key);
|
super(key: key);
|
||||||
|
|
||||||
|
/// The [Channel] to show the name for.
|
||||||
final Channel channel;
|
final Channel channel;
|
||||||
|
|
||||||
/// The style of the text displayed
|
/// The style of the text displayed
|
||||||
|
|||||||
Reference in New Issue
Block a user