base redesign
This commit is contained in:
parent
f96e9557d5
commit
a581260dc3
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg width="33" height="33" viewBox="0 0 33 33" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4.20001 29.8333H28.2" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M7.66665 11.6733H5.53335C4.80001 11.6733 4.20001 12.2733 4.20001 13.0067V24.5C4.20001 25.2333 4.80001 25.8333 5.53335 25.8333H7.66665C8.39998 25.8333 8.99998 25.2333 8.99998 24.5V13.0067C8.99998 12.2733 8.39998 11.6733 7.66665 11.6733Z" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M17.2667 7.42017H15.1334C14.4 7.42017 13.8 8.02017 13.8 8.7535V24.5002C13.8 25.2335 14.4 25.8335 15.1334 25.8335H17.2667C18 25.8335 18.6 25.2335 18.6 24.5002V8.7535C18.6 8.02017 18 7.42017 17.2667 7.42017Z" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M26.8667 3.16675H24.7334C24 3.16675 23.4 3.76675 23.4 4.50008V24.5001C23.4 25.2334 24 25.8334 24.7334 25.8334H26.8667C27.6 25.8334 28.2 25.2334 28.2 24.5001V4.50008C28.2 3.76675 27.6 3.16675 26.8667 3.16675Z" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="25" height="25" viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M18.2 2.6L8.26999 5.09C6.81999 5.45 5.35 6.92 4.99 8.37L2.49999 18.3C1.74999 21.3 3.58999 23.15 6.59999 22.4L16.53 19.92C17.97 19.56 19.45 18.08 19.81 16.64L22.3 6.7C23.05 3.7 21.2 1.85 18.2 2.6Z" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M12.4 16C14.333 16 15.9 14.433 15.9 12.5C15.9 10.567 14.333 9 12.4 9C10.467 9 8.89999 10.567 8.89999 12.5C8.89999 14.433 10.467 16 12.4 16Z" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 625 B |
|
|
@ -0,0 +1,4 @@
|
||||||
|
<svg width="32" height="33" viewBox="0 0 32 33" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M16 24.5V20.5" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
<path d="M13.4267 4.25996L4.18667 11.66C3.14667 12.4866 2.48001 14.2333 2.70667 15.54L4.48001 26.1533C4.80001 28.0466 6.61334 29.58 8.53334 29.58H23.4667C25.3733 29.58 27.2 28.0333 27.52 26.1533L29.2933 15.54C29.5067 14.2333 28.84 12.4866 27.8133 11.66L18.5733 4.2733C17.1467 3.12663 14.84 3.12663 13.4267 4.25996Z" stroke="#666666" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 609 B |
|
|
@ -17,7 +17,7 @@ class CategoriesPage extends StatelessWidget {
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 20),
|
const SizedBox(height: 20),
|
||||||
const MainCategories(),
|
// const MainCategories(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,380 @@
|
||||||
|
import 'package:didvan/config/theme_data.dart';
|
||||||
|
import 'package:didvan/constants/app_icons.dart';
|
||||||
|
import 'package:didvan/main.dart';
|
||||||
|
import 'package:didvan/models/home_page_content/home_page_list.dart';
|
||||||
|
import 'package:didvan/models/home_page_content/swot.dart';
|
||||||
|
import 'package:didvan/routes/routes.dart';
|
||||||
|
import 'package:didvan/services/app_initalizer.dart';
|
||||||
|
import 'package:didvan/views/home/main/main_page_state.dart';
|
||||||
|
import 'package:didvan/views/home/main/widgets/banner.dart';
|
||||||
|
import 'package:didvan/views/home/main/widgets/general_item.dart';
|
||||||
|
import 'package:didvan/views/home/main/widgets/podcast_item.dart';
|
||||||
|
import 'package:didvan/views/widgets/didvan/slider.dart';
|
||||||
|
import 'package:didvan/views/widgets/didvan/text.dart';
|
||||||
|
import 'package:didvan/views/widgets/state_handlers/state_handler.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:didvan/services/network/request.dart';
|
||||||
|
import 'package:url_launcher/url_launcher_string.dart';
|
||||||
|
import 'package:didvan/views/home/main/widgets/swot_item_card.dart';
|
||||||
|
import 'package:flutter/foundation.dart' show kIsWeb, defaultTargetPlatform;
|
||||||
|
import 'package:universal_html/html.dart' as html;
|
||||||
|
|
||||||
|
import 'package:didvan/views/home/main/main_page.dart';
|
||||||
|
|
||||||
|
bool isAnyMobile() {
|
||||||
|
if (kIsWeb) {
|
||||||
|
final userAgent = html.window.navigator.userAgent.toLowerCase();
|
||||||
|
return userAgent.contains('mobile') ||
|
||||||
|
userAgent.contains('android') ||
|
||||||
|
userAgent.contains('ios');
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultTargetPlatform == TargetPlatform.android ||
|
||||||
|
defaultTargetPlatform == TargetPlatform.iOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ExplorePage extends StatelessWidget {
|
||||||
|
const ExplorePage({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Consumer<MainPageState>(
|
||||||
|
builder: (context, state, child) {
|
||||||
|
return StateHandler<MainPageState>(
|
||||||
|
onRetry: () => context.read<MainPageState>().init(),
|
||||||
|
state: state,
|
||||||
|
builder: (context, state) {
|
||||||
|
final List<Widget> pageContent = [];
|
||||||
|
if (state.content != null && state.content!.lists.isNotEmpty) {
|
||||||
|
final lists = state.content!.lists;
|
||||||
|
|
||||||
|
for (int i = 0; i < lists.length; i++) {
|
||||||
|
final currentList = lists[i];
|
||||||
|
|
||||||
|
if (i == 4) {
|
||||||
|
pageContent.add(
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 32),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 16,
|
||||||
|
right: 16,
|
||||||
|
bottom: 16,
|
||||||
|
top: 28,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
const InfoTitle(),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => {
|
||||||
|
Navigator.of(context)
|
||||||
|
.pushNamed(Routes.infography)
|
||||||
|
},
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
DidvanText(
|
||||||
|
"مشاهده همه",
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
const MainPageBanner(
|
||||||
|
isFirst: false,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pageContent.add(MainPageSection(
|
||||||
|
list: currentList,
|
||||||
|
isLast: i == lists.length - 1,
|
||||||
|
));
|
||||||
|
|
||||||
|
if (currentList.type == 'startup') {
|
||||||
|
pageContent.add(SwotSection(swotItems: state.swotItems));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ListView(
|
||||||
|
children: pageContent,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SwotSection extends StatelessWidget {
|
||||||
|
final List<SwotItem> swotItems;
|
||||||
|
const SwotSection({required this.swotItems});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (swotItems.isEmpty) {
|
||||||
|
return const SizedBox.shrink();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(0.0),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
/// Title Row
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(right: 20, top: 30),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
SvgPicture.asset(
|
||||||
|
"lib/assets/images/features/Saha Solid.svg",
|
||||||
|
color: Theme.of(context).colorScheme.title,
|
||||||
|
),
|
||||||
|
const SizedBox(width: 5),
|
||||||
|
DidvanText(
|
||||||
|
"ماژول فرصت و تهدید",
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
color: Theme.of(context).colorScheme.title,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
AppInitializer.openWebLink(
|
||||||
|
navigatorKey.currentContext!,
|
||||||
|
'http://opportunity-threat.didvan.com/?accessToken=${RequestService.token}',
|
||||||
|
mode: LaunchMode.inAppWebView,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(left: 20),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
DidvanText(
|
||||||
|
"مشاهده همه",
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
const SizedBox(height: 16),
|
||||||
|
|
||||||
|
/// Swot Items Slider
|
||||||
|
DidvanSlider(
|
||||||
|
height: 330,
|
||||||
|
itemCount: 7,
|
||||||
|
viewportFraction: isAnyMobile() ? 0.65 : 0.55,
|
||||||
|
itemBuilder: (context, index, realIndex) => Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 0.0),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(8.0),
|
||||||
|
child: SwotItemCard(item: swotItems[index]),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class InfoTitle extends StatelessWidget {
|
||||||
|
const InfoTitle({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
DidvanIcons.infography_solid,
|
||||||
|
color: Theme.of(context).colorScheme.title,
|
||||||
|
),
|
||||||
|
const SizedBox(width: 4),
|
||||||
|
DidvanText(
|
||||||
|
"اینفوگرافی",
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
color: Theme.of(context).colorScheme.title,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainPageSection extends StatelessWidget {
|
||||||
|
final MainPageList list;
|
||||||
|
final bool isLast;
|
||||||
|
|
||||||
|
const MainPageSection({required this.list, required this.isLast});
|
||||||
|
|
||||||
|
void _moreHandler(BuildContext context) {
|
||||||
|
if (list.link.startsWith('http')) {
|
||||||
|
AppInitializer.openWebLink(
|
||||||
|
context,
|
||||||
|
'${list.link}?accessToken=${RequestService.token}',
|
||||||
|
mode: LaunchMode.inAppWebView,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Navigator.of(context).pushNamed(list.link);
|
||||||
|
}
|
||||||
|
|
||||||
|
IconData? _generateIcon() {
|
||||||
|
switch (list.type) {
|
||||||
|
case 'news':
|
||||||
|
return DidvanIcons.foolad_solid;
|
||||||
|
case 'radar':
|
||||||
|
return DidvanIcons.scanning_solid;
|
||||||
|
case 'video':
|
||||||
|
return DidvanIcons.video_solid;
|
||||||
|
case 'podcast':
|
||||||
|
return DidvanIcons.podcast_solid;
|
||||||
|
case 'trend':
|
||||||
|
return DidvanIcons.chart_solid;
|
||||||
|
case 'technology':
|
||||||
|
return DidvanIcons.technology_solid;
|
||||||
|
case 'risk':
|
||||||
|
return DidvanIcons.exclamation_triangle_solid;
|
||||||
|
case 'startup':
|
||||||
|
return DidvanIcons.startup_solid;
|
||||||
|
case 'delphi':
|
||||||
|
return DidvanIcons.saha_solid;
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int _maxSublistCount() {
|
||||||
|
int max = 1;
|
||||||
|
for (var i = 0; i < list.contents.length; i++) {
|
||||||
|
if (list.contents[i].subtitles.length > max) {
|
||||||
|
max = list.contents[i].subtitles.length;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final icon = _generateIcon();
|
||||||
|
|
||||||
|
if (list.contents.isEmpty) {
|
||||||
|
return const SizedBox();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (list.type == 'delphi') {
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
_buildSectionHeader(context, icon),
|
||||||
|
_buildSectionSlider(context),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
children: [
|
||||||
|
_buildSectionHeader(context, icon),
|
||||||
|
_buildSectionSlider(context),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Padding _buildSectionHeader(BuildContext context, IconData? icon) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
left: 16,
|
||||||
|
right: 16,
|
||||||
|
bottom: 16,
|
||||||
|
top: 28,
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
if (icon != null)
|
||||||
|
Icon(
|
||||||
|
icon,
|
||||||
|
color: Theme.of(context).colorScheme.title,
|
||||||
|
),
|
||||||
|
const SizedBox(width: 4),
|
||||||
|
DidvanText(
|
||||||
|
list.header,
|
||||||
|
style: Theme.of(context).textTheme.titleMedium,
|
||||||
|
color: Theme.of(context).colorScheme.title,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
GestureDetector(
|
||||||
|
onTap: () => _moreHandler(context),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
DidvanText(
|
||||||
|
"مشاهده همه",
|
||||||
|
color: Theme.of(context).colorScheme.primary,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildSectionSlider(BuildContext context) {
|
||||||
|
if (list.type == 'podcast') {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 28),
|
||||||
|
child: Column(
|
||||||
|
children: list.contents
|
||||||
|
.map(
|
||||||
|
(e) => Padding(
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
bottom: 12,
|
||||||
|
left: 28,
|
||||||
|
right: 28,
|
||||||
|
),
|
||||||
|
child: MainPagePodcastItem(
|
||||||
|
content: e,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DidvanSlider(
|
||||||
|
height: 260 + (_maxSublistCount() - (list.type == 'radar' ? 1 : 0)) * 20,
|
||||||
|
itemCount: list.contents.length,
|
||||||
|
viewportFraction: isAnyMobile() ? 0.65 : 0.55,
|
||||||
|
itemBuilder: (context, index, realIndex) => Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 4),
|
||||||
|
child: MainPageGeneralItem(
|
||||||
|
content: list.contents[index],
|
||||||
|
type: list.type,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ import 'package:didvan/providers/theme.dart';
|
||||||
import 'package:didvan/services/app_initalizer.dart';
|
import 'package:didvan/services/app_initalizer.dart';
|
||||||
import 'package:didvan/utils/action_sheet.dart';
|
import 'package:didvan/utils/action_sheet.dart';
|
||||||
import 'package:didvan/views/home/categories/categories_page.dart';
|
import 'package:didvan/views/home/categories/categories_page.dart';
|
||||||
|
import 'package:didvan/views/home/explore/explore.dart';
|
||||||
import 'package:didvan/views/home/main/main_page.dart';
|
import 'package:didvan/views/home/main/main_page.dart';
|
||||||
import 'package:didvan/views/home/home_state.dart';
|
import 'package:didvan/views/home/home_state.dart';
|
||||||
import 'package:didvan/views/home/new_statistic/new_statistic.dart';
|
import 'package:didvan/views/home/new_statistic/new_statistic.dart';
|
||||||
|
|
@ -33,18 +34,19 @@ class _HomeState extends State<Home>
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
// Remove dialog showing logic to prevent welcome popups
|
|
||||||
// if (widget.showDialogs ?? false) {
|
|
||||||
// _showDialog(context);
|
|
||||||
// }
|
|
||||||
|
|
||||||
final state = context.read<HomeState>();
|
final state = context.read<HomeState>();
|
||||||
DesignConfig.updateSystemUiOverlayStyle();
|
DesignConfig.updateSystemUiOverlayStyle();
|
||||||
_tabController = TabController(length: 3, vsync: this, initialIndex: 0);
|
// Change length from 3 to 4
|
||||||
|
_tabController = TabController(length: 4, vsync: this, initialIndex: 0);
|
||||||
state.tabController = _tabController;
|
state.tabController = _tabController;
|
||||||
|
|
||||||
_tabController.addListener(() {
|
_tabController.addListener(() {
|
||||||
|
// This check prevents errors if the controller is accessed after disposal.
|
||||||
|
if (_tabController.indexIsChanging) {
|
||||||
state.currentPageIndex = _tabController.index;
|
state.currentPageIndex = _tabController.index;
|
||||||
|
} else {
|
||||||
|
state.currentPageIndex = _tabController.index;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
if (!kIsWeb) {
|
if (!kIsWeb) {
|
||||||
Future.delayed(Duration.zero, () {
|
Future.delayed(Duration.zero, () {
|
||||||
|
|
@ -76,7 +78,6 @@ class _HomeState extends State<Home>
|
||||||
backgroundColor: Theme.of(context).colorScheme.background,
|
backgroundColor: Theme.of(context).colorScheme.background,
|
||||||
resizeToAvoidBottomInset: false,
|
resizeToAvoidBottomInset: false,
|
||||||
drawer: null,
|
drawer: null,
|
||||||
// ignore: deprecated_member_use
|
|
||||||
body: WillPopScope(
|
body: WillPopScope(
|
||||||
onWillPop: () async {
|
onWillPop: () async {
|
||||||
if (context.read<HomeState>().tabController.index == 0) {
|
if (context.read<HomeState>().tabController.index == 0) {
|
||||||
|
|
@ -112,10 +113,12 @@ class _HomeState extends State<Home>
|
||||||
child: TabBarView(
|
child: TabBarView(
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
controller: _tabController,
|
controller: _tabController,
|
||||||
|
// Add ExplorePage here
|
||||||
children: const [
|
children: const [
|
||||||
MainPage(),
|
MainPage(),
|
||||||
CategoriesPage(),
|
CategoriesPage(),
|
||||||
NewStatistic(),
|
NewStatistic(),
|
||||||
|
ExplorePage(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -78,10 +78,6 @@ class _MainPageState extends State<MainPage> {
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
print("DEBUG: FutureBuilder waiting");
|
print("DEBUG: FutureBuilder waiting");
|
||||||
print("DEBUG: FutureBuilder state.stories.isNotEmpty: ${state.stories.isNotEmpty}");
|
print("DEBUG: FutureBuilder state.stories.isNotEmpty: ${state.stories.isNotEmpty}");
|
||||||
print("DEBUG: FutureBuilder state.content: ${state.content!.lists}");
|
|
||||||
print("DEBUG: FutureBuilder state.content != null: ${state.content != null}");
|
|
||||||
print(
|
|
||||||
"DEBUG: FutureBuilder state.content!.lists.isNotEmpty: ${state.content!.lists.isNotEmpty}");
|
|
||||||
return ListView(
|
return ListView(
|
||||||
padding: const EdgeInsets.only(top: 0, bottom: 16),
|
padding: const EdgeInsets.only(top: 0, bottom: 16),
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -150,71 +146,6 @@ class _MainPageState extends State<MainPage> {
|
||||||
padding: EdgeInsets.symmetric(horizontal: 16),
|
padding: EdgeInsets.symmetric(horizontal: 16),
|
||||||
child: MainPageMainContent(),
|
child: MainPageMainContent(),
|
||||||
),
|
),
|
||||||
Builder(builder: (context) {
|
|
||||||
final List<Widget> pageContent = [];
|
|
||||||
if (state.content != null && state.content!.lists.isNotEmpty) {
|
|
||||||
final lists = state.content!.lists;
|
|
||||||
|
|
||||||
for (int i = 0; i < lists.length; i++) {
|
|
||||||
final currentList = lists[i];
|
|
||||||
|
|
||||||
if (i == 4) {
|
|
||||||
pageContent.add(
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 32),
|
|
||||||
child: Column(
|
|
||||||
children: [
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(
|
|
||||||
left: 16,
|
|
||||||
right: 16,
|
|
||||||
bottom: 16,
|
|
||||||
top: 28,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
const InfoTitle(),
|
|
||||||
GestureDetector(
|
|
||||||
onTap: () => {
|
|
||||||
Navigator.of(context)
|
|
||||||
.pushNamed(Routes.infography)
|
|
||||||
},
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
DidvanText(
|
|
||||||
"مشاهده همه",
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const MainPageBanner(
|
|
||||||
isFirst: false,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
pageContent.add(_MainPageSection(
|
|
||||||
list: currentList,
|
|
||||||
isLast: i == lists.length - 1,
|
|
||||||
));
|
|
||||||
|
|
||||||
if (currentList.type == 'startup') {
|
|
||||||
pageContent.add(_SwotSection(swotItems: state.swotItems));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print("DEBUG: FutureBuilder error");
|
|
||||||
return Column(children: pageContent);
|
|
||||||
}),
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
@ -297,109 +228,6 @@ class _MainPageState extends State<MainPage> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _SwotSection extends StatelessWidget {
|
|
||||||
final List<SwotItem> swotItems;
|
|
||||||
const _SwotSection({required this.swotItems});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
if (swotItems.isEmpty) {
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.all(0.0),
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
/// Title Row
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(right: 20, top: 30),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
SvgPicture.asset(
|
|
||||||
"lib/assets/images/features/Saha Solid.svg",
|
|
||||||
color: Theme.of(context).colorScheme.title,
|
|
||||||
),
|
|
||||||
const SizedBox(width: 5),
|
|
||||||
DidvanText(
|
|
||||||
"ماژول فرصت و تهدید",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
color: Theme.of(context).colorScheme.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
GestureDetector(
|
|
||||||
onTap: () {
|
|
||||||
AppInitializer.openWebLink(
|
|
||||||
navigatorKey.currentContext!,
|
|
||||||
'http://opportunity-threat.didvan.com/?accessToken=${RequestService.token}',
|
|
||||||
mode: LaunchMode.inAppWebView,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
child: Padding(
|
|
||||||
padding: EdgeInsets.only(left: 20),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
DidvanText(
|
|
||||||
"مشاهده همه",
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
const SizedBox(height: 16),
|
|
||||||
|
|
||||||
/// Swot Items Slider
|
|
||||||
DidvanSlider(
|
|
||||||
height: 330,
|
|
||||||
itemCount: 7,
|
|
||||||
viewportFraction: isAnyMobile() ? 0.65 : 0.55,
|
|
||||||
itemBuilder: (context, index, realIndex) => Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 0.0),
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(8.0),
|
|
||||||
child: SwotItemCard(item: swotItems[index]),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class InfoTitle extends StatelessWidget {
|
|
||||||
const InfoTitle({super.key});
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
return Row(
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
DidvanIcons.infography_solid,
|
|
||||||
color: Theme.of(context).colorScheme.title,
|
|
||||||
),
|
|
||||||
const SizedBox(width: 4),
|
|
||||||
DidvanText(
|
|
||||||
"اینفوگرافی",
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
color: Theme.of(context).colorScheme.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class _DidvanSignalsTitle extends StatelessWidget {
|
class _DidvanSignalsTitle extends StatelessWidget {
|
||||||
const _DidvanSignalsTitle();
|
const _DidvanSignalsTitle();
|
||||||
|
|
||||||
|
|
@ -432,162 +260,3 @@ class _DidvanSignalsTitle extends StatelessWidget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _MainPageSection extends StatelessWidget {
|
|
||||||
final MainPageList list;
|
|
||||||
final bool isLast;
|
|
||||||
|
|
||||||
const _MainPageSection({required this.list, required this.isLast});
|
|
||||||
|
|
||||||
void _moreHandler(BuildContext context) {
|
|
||||||
if (list.link.startsWith('http')) {
|
|
||||||
AppInitializer.openWebLink(
|
|
||||||
context,
|
|
||||||
'${list.link}?accessToken=${RequestService.token}',
|
|
||||||
mode: LaunchMode.inAppWebView,
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
Navigator.of(context).pushNamed(list.link);
|
|
||||||
}
|
|
||||||
|
|
||||||
IconData? _generateIcon() {
|
|
||||||
switch (list.type) {
|
|
||||||
case 'news':
|
|
||||||
return DidvanIcons.foolad_solid;
|
|
||||||
case 'radar':
|
|
||||||
return DidvanIcons.scanning_solid;
|
|
||||||
case 'video':
|
|
||||||
return DidvanIcons.video_solid;
|
|
||||||
case 'podcast':
|
|
||||||
return DidvanIcons.podcast_solid;
|
|
||||||
case 'trend':
|
|
||||||
return DidvanIcons.chart_solid;
|
|
||||||
case 'technology':
|
|
||||||
return DidvanIcons.technology_solid;
|
|
||||||
case 'risk':
|
|
||||||
return DidvanIcons.exclamation_triangle_solid;
|
|
||||||
case 'startup':
|
|
||||||
return DidvanIcons.startup_solid;
|
|
||||||
case 'delphi':
|
|
||||||
return DidvanIcons.saha_solid;
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int _maxSublistCount() {
|
|
||||||
int max = 1;
|
|
||||||
for (var i = 0; i < list.contents.length; i++) {
|
|
||||||
if (list.contents[i].subtitles.length > max) {
|
|
||||||
max = list.contents[i].subtitles.length;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return max - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final icon = _generateIcon();
|
|
||||||
|
|
||||||
if (list.contents.isEmpty) {
|
|
||||||
return const SizedBox();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (list.type == 'delphi') {
|
|
||||||
return Column(
|
|
||||||
children: [
|
|
||||||
_buildSectionHeader(context, icon),
|
|
||||||
_buildSectionSlider(context),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Column(
|
|
||||||
children: [
|
|
||||||
_buildSectionHeader(context, icon),
|
|
||||||
_buildSectionSlider(context),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Padding _buildSectionHeader(BuildContext context, IconData? icon) {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(
|
|
||||||
left: 16,
|
|
||||||
right: 16,
|
|
||||||
bottom: 16,
|
|
||||||
top: 28,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
||||||
children: [
|
|
||||||
Row(
|
|
||||||
children: [
|
|
||||||
if (icon != null)
|
|
||||||
Icon(
|
|
||||||
icon,
|
|
||||||
color: Theme.of(context).colorScheme.title,
|
|
||||||
),
|
|
||||||
const SizedBox(width: 4),
|
|
||||||
DidvanText(
|
|
||||||
list.header,
|
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
|
||||||
color: Theme.of(context).colorScheme.title,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
GestureDetector(
|
|
||||||
onTap: () => _moreHandler(context),
|
|
||||||
child: Row(
|
|
||||||
children: [
|
|
||||||
DidvanText(
|
|
||||||
"مشاهده همه",
|
|
||||||
color: Theme.of(context).colorScheme.primary,
|
|
||||||
fontWeight: FontWeight.bold,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
)
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildSectionSlider(BuildContext context) {
|
|
||||||
if (list.type == 'podcast') {
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 28),
|
|
||||||
child: Column(
|
|
||||||
children: list.contents
|
|
||||||
.map(
|
|
||||||
(e) => Padding(
|
|
||||||
padding: const EdgeInsets.only(
|
|
||||||
bottom: 12,
|
|
||||||
left: 28,
|
|
||||||
right: 28,
|
|
||||||
),
|
|
||||||
child: MainPagePodcastItem(
|
|
||||||
content: e,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.toList(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return DidvanSlider(
|
|
||||||
height: 260 + (_maxSublistCount() - (list.type == 'radar' ? 1 : 0)) * 20,
|
|
||||||
itemCount: list.contents.length,
|
|
||||||
viewportFraction: isAnyMobile() ? 0.65 : 0.55,
|
|
||||||
itemBuilder: (context, index, realIndex) => Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 4),
|
|
||||||
child: MainPageGeneralItem(
|
|
||||||
content: list.contents[index],
|
|
||||||
type: list.type,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// ignore_for_file: deprecated_member_use
|
// // ignore_for_file: deprecated_member_use
|
||||||
|
|
||||||
import 'package:didvan/config/theme_data.dart';
|
import 'package:didvan/config/theme_data.dart';
|
||||||
import 'package:didvan/views/home/main/widgets/banner.dart';
|
import 'package:didvan/views/home/main/widgets/banner.dart';
|
||||||
|
|
@ -8,36 +8,35 @@ import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class MainPageMainContent extends StatelessWidget {
|
class MainPageMainContent extends StatelessWidget {
|
||||||
const MainPageMainContent({super.key});
|
const MainPageMainContent({super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Column(
|
return const Column(
|
||||||
children: [
|
children: [
|
||||||
const MainPageBanner(
|
MainPageBanner(
|
||||||
isFirst: true,
|
isFirst: true,
|
||||||
),
|
),
|
||||||
const SizedBox(height: 28),
|
// const SizedBox(height: 28),
|
||||||
Center(
|
// Center(
|
||||||
child: Container(
|
// child: Container(
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
// padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||||
color: Theme.of(context).colorScheme.background,
|
// color: Theme.of(context).colorScheme.background,
|
||||||
child: DidvanText(
|
// child: DidvanText(
|
||||||
'دیدوان در یک نگاه',
|
// 'دیدوان در یک نگاه',
|
||||||
color: Theme.of(context).colorScheme.title,
|
// color: Theme.of(context).colorScheme.title,
|
||||||
style: Theme.of(context).textTheme.titleMedium,
|
// style: Theme.of(context).textTheme.titleMedium,
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
// ],
|
// // ],
|
||||||
|
// // ),
|
||||||
|
// const Padding(
|
||||||
|
// padding: EdgeInsets.only(
|
||||||
|
// left: 20,
|
||||||
|
// right: 20,
|
||||||
|
// top: 16,
|
||||||
|
// ),
|
||||||
|
// child: SizedBox(),
|
||||||
// ),
|
// ),
|
||||||
const Padding(
|
|
||||||
padding: EdgeInsets.only(
|
|
||||||
left: 20,
|
|
||||||
right: 20,
|
|
||||||
top: 16,
|
|
||||||
),
|
|
||||||
child: MainCategories(),
|
|
||||||
),
|
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,10 +57,9 @@ class DidvanBNB extends StatelessWidget {
|
||||||
selectedIcon: DidvanIcons.ai_solid,
|
selectedIcon: DidvanIcons.ai_solid,
|
||||||
unselectedIcon: DidvanIcons.ai_regular,
|
unselectedIcon: DidvanIcons.ai_regular,
|
||||||
onTap: () => Navigator.of(context).pushNamed(Routes.aiSection),
|
onTap: () => Navigator.of(context).pushNamed(Routes.aiSection),
|
||||||
|
isHomeButton: false,
|
||||||
customLogo: SvgPicture.asset(
|
customLogo: SvgPicture.asset(
|
||||||
DesignConfig.isDark
|
'lib/assets/icons/bot.svg',
|
||||||
? 'assets/images/logos/logo-vertical-dark.svg'
|
|
||||||
: 'lib/assets/icons/bot.svg',
|
|
||||||
width: 32,
|
width: 32,
|
||||||
height: 32,
|
height: 32,
|
||||||
),
|
),
|
||||||
|
|
@ -71,11 +70,11 @@ class DidvanBNB extends StatelessWidget {
|
||||||
selectedIcon: DidvanIcons.house_solid,
|
selectedIcon: DidvanIcons.house_solid,
|
||||||
unselectedIcon: DidvanIcons.house_light,
|
unselectedIcon: DidvanIcons.house_light,
|
||||||
onTap: () => onTabChanged(0),
|
onTap: () => onTabChanged(0),
|
||||||
isHomeButton: true,
|
isHomeButton: false,
|
||||||
customLogo: SvgPicture.asset(
|
customLogo: SvgPicture.asset(
|
||||||
DesignConfig.isDark
|
DesignConfig.isDark
|
||||||
? 'assets/images/logos/logo-vertical-dark.svg'
|
? 'assets/images/logos/logo-vertical-dark.svg'
|
||||||
: 'lib/assets/icons/New Home.svg',
|
: 'lib/assets/icons/home2.svg',
|
||||||
width: 32,
|
width: 32,
|
||||||
height: 32,
|
height: 32,
|
||||||
),
|
),
|
||||||
|
|
@ -86,20 +85,26 @@ class DidvanBNB extends StatelessWidget {
|
||||||
selectedIcon: DidvanIcons.stats__solid,
|
selectedIcon: DidvanIcons.stats__solid,
|
||||||
unselectedIcon: DidvanIcons.stats__light,
|
unselectedIcon: DidvanIcons.stats__light,
|
||||||
onTap: () => onTabChanged(2),
|
onTap: () => onTabChanged(2),
|
||||||
|
isHomeButton: false,
|
||||||
customLogo: SvgPicture.asset(
|
customLogo: SvgPicture.asset(
|
||||||
DesignConfig.isDark
|
DesignConfig.isDark
|
||||||
? 'assets/images/logos/logo-vertical-dark.svg'
|
? 'lib/assets/icons/stats_nav_icon_dark.svg'
|
||||||
: 'lib/assets/icons/bot.svg',
|
: 'lib/assets/icons/chart 2.svg',
|
||||||
width: 32,
|
width: 32,
|
||||||
height: 32,
|
height: 32,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
_NavBarItem(
|
_NavBarItem(
|
||||||
isSelected: false,
|
isSelected: currentTabIndex == 3,
|
||||||
title: 'پروفایل',
|
title: 'کاوش',
|
||||||
selectedIcon: DidvanIcons.profile_solid,
|
selectedIcon: DidvanIcons.profile_solid, // Placeholder
|
||||||
unselectedIcon: DidvanIcons.profile_light,
|
unselectedIcon: DidvanIcons.profile_light, // Placeholder
|
||||||
onTap: () => Navigator.of(context).pushNamed(Routes.profile),
|
onTap: () => onTabChanged(3),
|
||||||
|
customLogo: SvgPicture.asset(
|
||||||
|
'lib/assets/icons/discover.svg',
|
||||||
|
width: 25,
|
||||||
|
height: 25,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|
@ -149,29 +154,35 @@ class _NavBarItem extends StatelessWidget {
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 4,
|
height: 4,
|
||||||
),
|
),
|
||||||
if (isHomeButton && customLogo != null) ...[
|
if (customLogo != null) ...[
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
padding: const EdgeInsets.all(8),
|
padding: EdgeInsets.all(isHomeButton ? 8 : 4),
|
||||||
duration: DesignConfig.lowAnimationDuration,
|
duration: DesignConfig.lowAnimationDuration,
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: 50,
|
width: isHomeButton ? 50 : (isSelected ? 50 : 32),
|
||||||
height: 50,
|
height: isHomeButton ? 50 : (isSelected ? 50 : 32),
|
||||||
child: customLogo,
|
child: customLogo,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
if (!isHomeButton && !isSelected)
|
||||||
|
DidvanText(
|
||||||
|
title,
|
||||||
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
color: Theme.of(context).colorScheme.title,
|
||||||
|
),
|
||||||
] else ...[
|
] else ...[
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
padding: const EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
duration: DesignConfig.lowAnimationDuration,
|
duration: DesignConfig.lowAnimationDuration,
|
||||||
child: Icon(
|
child: Icon(
|
||||||
isSelected ? selectedIcon : unselectedIcon,
|
isSelected ? selectedIcon : unselectedIcon,
|
||||||
size: 32,
|
size: isSelected ? 40 : 32,
|
||||||
color: DesignConfig.isDark
|
color: DesignConfig.isDark
|
||||||
? Theme.of(context).colorScheme.text
|
? Theme.of(context).colorScheme.text
|
||||||
: Theme.of(context).colorScheme.title,
|
: Theme.of(context).colorScheme.title,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (!isHomeButton)
|
if (!isHomeButton && !isSelected)
|
||||||
DidvanText(
|
DidvanText(
|
||||||
title,
|
title,
|
||||||
style: Theme.of(context).textTheme.bodySmall,
|
style: Theme.of(context).textTheme.bodySmall,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue