Combine top streams and categories into one tab
This commit is contained in:
parent
8102ea6185
commit
0a729fbfa7
20 changed files with 84 additions and 104 deletions
|
|
@ -4,12 +4,11 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:frosty/core/auth/auth_store.dart';
|
||||
import 'package:frosty/core/settings/settings_store.dart';
|
||||
import 'package:frosty/screens/categories/categories_store.dart';
|
||||
import 'package:frosty/screens/followed_streams/followed_streams_store.dart';
|
||||
import 'package:frosty/screens/home/home.dart';
|
||||
import 'package:frosty/screens/home/home_store.dart';
|
||||
import 'package:frosty/screens/search/search_store.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_followed/followed_streams_store.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_top/top_streams_store.dart';
|
||||
import 'package:frosty/screens/top/categories/categories_store.dart';
|
||||
import 'package:frosty/screens/top/streams/top_streams_store.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
|
||||
|
|
@ -86,7 +85,6 @@ class MyApp extends StatelessWidget {
|
|||
title: 'Frosty',
|
||||
theme: settingsStore.oledTheme ? oledTheme : defaultTheme,
|
||||
home: Home(
|
||||
homeStore: HomeStore(),
|
||||
topStreamsStore: TopStreamsStore(authStore: authStore),
|
||||
followedStreamsStore: FollowedStreamsStore(authStore: authStore),
|
||||
categoriesStore: CategoriesStore(authStore: authStore),
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:frosty/screens/stream_list/stream_card.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_followed/followed_streams_store.dart';
|
||||
import 'package:frosty/screens/followed_streams/followed_streams_store.dart';
|
||||
import 'package:frosty/widgets/loading_indicator.dart';
|
||||
import 'package:frosty/widgets/stream_card.dart';
|
||||
|
||||
class FollowedStreams extends StatelessWidget {
|
||||
final FollowedStreamsStore store;
|
||||
|
|
@ -3,19 +3,16 @@ import 'package:flutter_mobx/flutter_mobx.dart';
|
|||
import 'package:frosty/core/auth/auth_store.dart';
|
||||
import 'package:frosty/core/settings/settings.dart';
|
||||
import 'package:frosty/core/settings/settings_store.dart';
|
||||
import 'package:frosty/screens/categories/categories.dart';
|
||||
import 'package:frosty/screens/categories/categories_store.dart';
|
||||
import 'package:frosty/screens/home/home_store.dart';
|
||||
import 'package:frosty/screens/followed_streams/followed_streams.dart';
|
||||
import 'package:frosty/screens/followed_streams/followed_streams_store.dart';
|
||||
import 'package:frosty/screens/search/search.dart';
|
||||
import 'package:frosty/screens/search/search_store.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_followed/followed_streams.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_followed/followed_streams_store.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_top/top_streams.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_top/top_streams_store.dart';
|
||||
import 'package:frosty/screens/top/categories/categories_store.dart';
|
||||
import 'package:frosty/screens/top/streams/top_streams_store.dart';
|
||||
import 'package:frosty/screens/top/top_section.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class Home extends StatelessWidget {
|
||||
final HomeStore homeStore;
|
||||
class Home extends StatefulWidget {
|
||||
final TopStreamsStore topStreamsStore;
|
||||
final FollowedStreamsStore followedStreamsStore;
|
||||
final CategoriesStore categoriesStore;
|
||||
|
|
@ -23,13 +20,27 @@ class Home extends StatelessWidget {
|
|||
|
||||
const Home({
|
||||
Key? key,
|
||||
required this.homeStore,
|
||||
required this.topStreamsStore,
|
||||
required this.followedStreamsStore,
|
||||
required this.categoriesStore,
|
||||
required this.searchStore,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
_HomeState createState() => _HomeState();
|
||||
}
|
||||
|
||||
class _HomeState extends State<Home> {
|
||||
int _selectedIndex = 0;
|
||||
|
||||
void _handleTap(int index) {
|
||||
if (index != _selectedIndex) {
|
||||
setState(() {
|
||||
_selectedIndex = index;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final authStore = context.read<AuthStore>();
|
||||
|
|
@ -41,12 +52,11 @@ class Home extends StatelessWidget {
|
|||
builder: (_) {
|
||||
final titles = [
|
||||
if (authStore.isLoggedIn) 'Followed Streams',
|
||||
'Top Streams',
|
||||
'Categories',
|
||||
'Top',
|
||||
'Search',
|
||||
];
|
||||
return Text(
|
||||
titles[homeStore.selectedIndex],
|
||||
titles[_selectedIndex],
|
||||
);
|
||||
},
|
||||
),
|
||||
|
|
@ -70,12 +80,11 @@ class Home extends StatelessWidget {
|
|||
child: Observer(
|
||||
builder: (_) {
|
||||
return IndexedStack(
|
||||
index: homeStore.selectedIndex,
|
||||
index: _selectedIndex,
|
||||
children: [
|
||||
if (authStore.isLoggedIn) FollowedStreams(store: followedStreamsStore),
|
||||
TopStreams(store: topStreamsStore),
|
||||
Categories(store: categoriesStore),
|
||||
Search(searchStore: searchStore),
|
||||
if (authStore.isLoggedIn) FollowedStreams(store: widget.followedStreamsStore),
|
||||
TopSection(topStreamsStore: widget.topStreamsStore, categoriesStore: widget.categoriesStore),
|
||||
Search(searchStore: widget.searchStore),
|
||||
],
|
||||
);
|
||||
},
|
||||
|
|
@ -95,17 +104,13 @@ class Home extends StatelessWidget {
|
|||
icon: Icon(Icons.arrow_upward),
|
||||
label: 'Top',
|
||||
),
|
||||
const BottomNavigationBarItem(
|
||||
icon: Icon(Icons.games),
|
||||
label: 'Categories',
|
||||
),
|
||||
const BottomNavigationBarItem(
|
||||
icon: Icon(Icons.search),
|
||||
label: 'Search',
|
||||
),
|
||||
],
|
||||
currentIndex: homeStore.selectedIndex,
|
||||
onTap: homeStore.handleTap,
|
||||
currentIndex: _selectedIndex,
|
||||
onTap: _handleTap,
|
||||
);
|
||||
},
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,17 +0,0 @@
|
|||
import 'package:mobx/mobx.dart';
|
||||
|
||||
part 'home_store.g.dart';
|
||||
|
||||
class HomeStore = _HomeStoreBase with _$HomeStore;
|
||||
|
||||
abstract class _HomeStoreBase with Store {
|
||||
@observable
|
||||
int selectedIndex = 0;
|
||||
|
||||
@action
|
||||
void handleTap(int index) {
|
||||
if (index != selectedIndex) {
|
||||
selectedIndex = index;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'home_store.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// StoreGenerator
|
||||
// **************************************************************************
|
||||
|
||||
// ignore_for_file: non_constant_identifier_names, unnecessary_brace_in_string_interps, unnecessary_lambdas, prefer_expression_function_bodies, lines_longer_than_80_chars, avoid_as, avoid_annotating_with_dynamic
|
||||
|
||||
mixin _$HomeStore on _HomeStoreBase, Store {
|
||||
final _$selectedIndexAtom = Atom(name: '_HomeStoreBase.selectedIndex');
|
||||
|
||||
@override
|
||||
int get selectedIndex {
|
||||
_$selectedIndexAtom.reportRead();
|
||||
return super.selectedIndex;
|
||||
}
|
||||
|
||||
@override
|
||||
set selectedIndex(int value) {
|
||||
_$selectedIndexAtom.reportWrite(value, super.selectedIndex, () {
|
||||
super.selectedIndex = value;
|
||||
});
|
||||
}
|
||||
|
||||
final _$_HomeStoreBaseActionController =
|
||||
ActionController(name: '_HomeStoreBase');
|
||||
|
||||
@override
|
||||
void handleTap(int index) {
|
||||
final _$actionInfo = _$_HomeStoreBaseActionController.startAction(
|
||||
name: '_HomeStoreBase.handleTap');
|
||||
try {
|
||||
return super.handleTap(index);
|
||||
} finally {
|
||||
_$_HomeStoreBaseActionController.endAction(_$actionInfo);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return '''
|
||||
selectedIndex: ${selectedIndex}
|
||||
''';
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:frosty/models/category.dart';
|
||||
import 'package:frosty/screens/categories/category_card.dart';
|
||||
import 'package:frosty/screens/top/categories/category_card.dart';
|
||||
|
||||
class SearchResultsCategories extends StatelessWidget {
|
||||
final List<CategoryTwitch> categories;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:frosty/screens/categories/categories_store.dart';
|
||||
import 'package:frosty/screens/categories/category_card.dart';
|
||||
import 'package:frosty/screens/top/categories/categories_store.dart';
|
||||
import 'package:frosty/screens/top/categories/category_card.dart';
|
||||
|
||||
class Categories extends StatelessWidget {
|
||||
final CategoriesStore store;
|
||||
|
|
@ -2,8 +2,8 @@ import 'package:cached_network_image/cached_network_image.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:frosty/core/auth/auth_store.dart';
|
||||
import 'package:frosty/models/category.dart';
|
||||
import 'package:frosty/screens/categories/category_streams_list/category_streams.dart';
|
||||
import 'package:frosty/screens/categories/category_streams_list/category_streams_store.dart';
|
||||
import 'package:frosty/screens/top/categories/category_streams_list/category_streams.dart';
|
||||
import 'package:frosty/screens/top/categories/category_streams_list/category_streams_store.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
/// A tappable card widget that displays a category's box art and name.
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:frosty/screens/categories/category_streams_list/category_streams_store.dart';
|
||||
import 'package:frosty/screens/stream_list/stream_card.dart';
|
||||
import 'package:frosty/screens/top/categories/category_streams_list/category_streams_store.dart';
|
||||
import 'package:frosty/widgets/stream_card.dart';
|
||||
|
||||
class CategoryStreams extends StatelessWidget {
|
||||
final CategoryStreamsStore store;
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
import 'package:frosty/screens/stream_list/stream_card.dart';
|
||||
import 'package:frosty/screens/stream_list/streams_top/top_streams_store.dart';
|
||||
import 'package:frosty/screens/top/streams/top_streams_store.dart';
|
||||
import 'package:frosty/widgets/loading_indicator.dart';
|
||||
import 'package:frosty/widgets/stream_card.dart';
|
||||
|
||||
class TopStreams extends StatelessWidget {
|
||||
final TopStreamsStore store;
|
||||
41
lib/screens/top/top_section.dart
Normal file
41
lib/screens/top/top_section.dart
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:frosty/screens/top/categories/categories.dart';
|
||||
import 'package:frosty/screens/top/categories/categories_store.dart';
|
||||
import 'package:frosty/screens/top/streams/top_streams.dart';
|
||||
import 'package:frosty/screens/top/streams/top_streams_store.dart';
|
||||
|
||||
class TopSection extends StatelessWidget {
|
||||
final TopStreamsStore topStreamsStore;
|
||||
final CategoriesStore categoriesStore;
|
||||
|
||||
const TopSection({
|
||||
Key? key,
|
||||
required this.topStreamsStore,
|
||||
required this.categoriesStore,
|
||||
}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return DefaultTabController(
|
||||
length: 2,
|
||||
child: Column(
|
||||
children: [
|
||||
const TabBar(
|
||||
tabs: [
|
||||
Tab(text: 'Streams'),
|
||||
Tab(text: 'Categories'),
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
child: TabBarView(
|
||||
children: [
|
||||
TopStreams(store: topStreamsStore),
|
||||
Categories(store: categoriesStore),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue