Refactor to add header to the Tracked Item pages.
This commit is contained in:
parent
2d9c93fec4
commit
e896611bd1
lib
@ -2,21 +2,26 @@ enum ItemType {
|
|||||||
expense(
|
expense(
|
||||||
title: "Expense",
|
title: "Expense",
|
||||||
plural: "Expenses",
|
plural: "Expenses",
|
||||||
|
description: "Items which cost revenue, or decrease asset value.",
|
||||||
),
|
),
|
||||||
income(
|
income(
|
||||||
title: "Income",
|
title: "Income",
|
||||||
plural: "Incomes",
|
plural: "Income",
|
||||||
|
description: "Items which bring in revenue, or increase asset value.",
|
||||||
),
|
),
|
||||||
asset(
|
asset(
|
||||||
title: "Asset",
|
title: "Asset",
|
||||||
plural: "Assets",
|
plural: "Assets",
|
||||||
|
description: "Value which has been earned and can be spent.",
|
||||||
);
|
);
|
||||||
|
|
||||||
const ItemType({
|
const ItemType({
|
||||||
required this.title,
|
required this.title,
|
||||||
required this.plural,
|
required this.plural,
|
||||||
|
required this.description,
|
||||||
});
|
});
|
||||||
|
|
||||||
final String title;
|
final String title;
|
||||||
final String plural;
|
final String plural;
|
||||||
|
final String description;
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
switch (pageSelected) {
|
switch (pageSelected) {
|
||||||
case 0:
|
case 0:
|
||||||
page = TrackedItemPage(
|
page = TrackedItemPage(
|
||||||
assetsToLoad: DatabaseHelper.instance.getExpenses(),
|
assetType: ItemType.expense,
|
||||||
notifyParent: refresh,
|
notifyParent: refresh,
|
||||||
);
|
);
|
||||||
dialog = TrackedItemInputDialog(
|
dialog = TrackedItemInputDialog(
|
||||||
@ -66,7 +66,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
page = TrackedItemPage(
|
page = TrackedItemPage(
|
||||||
assetsToLoad: DatabaseHelper.instance.getIncomes(),
|
assetType: ItemType.income,
|
||||||
notifyParent: refresh,
|
notifyParent: refresh,
|
||||||
);
|
);
|
||||||
dialog = TrackedItemInputDialog(
|
dialog = TrackedItemInputDialog(
|
||||||
@ -76,7 +76,7 @@ class _HomePageState extends State<HomePage> {
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
page = TrackedItemPage(
|
page = TrackedItemPage(
|
||||||
assetsToLoad: DatabaseHelper.instance.getAssets(),
|
assetType: ItemType.asset,
|
||||||
notifyParent: refresh,
|
notifyParent: refresh,
|
||||||
);
|
);
|
||||||
dialog = TrackedItemInputDialog(
|
dialog = TrackedItemInputDialog(
|
||||||
@ -120,15 +120,15 @@ class _HomePageState extends State<HomePage> {
|
|||||||
destinations: [
|
destinations: [
|
||||||
NavigationRailDestination(
|
NavigationRailDestination(
|
||||||
icon: Icon(Icons.payment),
|
icon: Icon(Icons.payment),
|
||||||
label: Text('Expenses'),
|
label: Text(ItemType.expense.plural),
|
||||||
),
|
),
|
||||||
NavigationRailDestination(
|
NavigationRailDestination(
|
||||||
icon: Icon(Icons.account_balance),
|
icon: Icon(Icons.account_balance),
|
||||||
label: Text('Income'),
|
label: Text(ItemType.income.plural),
|
||||||
),
|
),
|
||||||
NavigationRailDestination(
|
NavigationRailDestination(
|
||||||
icon: Icon(Icons.attach_money),
|
icon: Icon(Icons.attach_money),
|
||||||
label: Text('Liquid Assets'),
|
label: Text(ItemType.asset.plural),
|
||||||
),
|
),
|
||||||
NavigationRailDestination(
|
NavigationRailDestination(
|
||||||
icon: Icon(Icons.bar_chart),
|
icon: Icon(Icons.bar_chart),
|
||||||
|
@ -11,12 +11,12 @@ import '/models/frequency.dart';
|
|||||||
import '/db.dart';
|
import '/db.dart';
|
||||||
|
|
||||||
class TrackedItemPage extends StatefulWidget {
|
class TrackedItemPage extends StatefulWidget {
|
||||||
final Future<List<TrackedItem>> assetsToLoad;
|
final ItemType assetType;
|
||||||
final Function() notifyParent;
|
final Function() notifyParent;
|
||||||
|
|
||||||
const TrackedItemPage({
|
const TrackedItemPage({
|
||||||
super.key,
|
super.key,
|
||||||
required this.assetsToLoad,
|
required this.assetType,
|
||||||
required this.notifyParent,
|
required this.notifyParent,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -25,12 +25,28 @@ class TrackedItemPage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _TrackedItemPageState extends State<TrackedItemPage> {
|
class _TrackedItemPageState extends State<TrackedItemPage> {
|
||||||
|
late Future<List<TrackedItem>> _assetsToLoad;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final theme = Theme.of(context);
|
final theme = Theme.of(context);
|
||||||
|
|
||||||
|
switch (widget.assetType) {
|
||||||
|
case ItemType.expense:
|
||||||
|
_assetsToLoad = DatabaseHelper.instance.getExpenses();
|
||||||
|
break;
|
||||||
|
case ItemType.income:
|
||||||
|
_assetsToLoad = DatabaseHelper.instance.getIncomes();
|
||||||
|
break;
|
||||||
|
case ItemType.asset:
|
||||||
|
_assetsToLoad = DatabaseHelper.instance.getAssets();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw UnimplementedError("Unsure whch asset group to load.");
|
||||||
|
}
|
||||||
|
|
||||||
return FutureBuilder<List<TrackedItem>>(
|
return FutureBuilder<List<TrackedItem>>(
|
||||||
future: widget.assetsToLoad,
|
future: _assetsToLoad,
|
||||||
builder:
|
builder:
|
||||||
(BuildContext context, AsyncSnapshot<List<TrackedItem>> snapshot) {
|
(BuildContext context, AsyncSnapshot<List<TrackedItem>> snapshot) {
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
@ -46,204 +62,237 @@ class _TrackedItemPageState extends State<TrackedItemPage> {
|
|||||||
"Add items to get started.",
|
"Add items to get started.",
|
||||||
softWrap: true,
|
softWrap: true,
|
||||||
)
|
)
|
||||||
: ListView.builder(
|
: Column(
|
||||||
itemCount: snapshot.data!.length,
|
children: [
|
||||||
itemBuilder: (_, index) {
|
Text(
|
||||||
final TrackedItem curr = snapshot.data![index];
|
"${widget.assetType.plural}",
|
||||||
|
style: TextStyle(
|
||||||
final itemKey = Key(curr.id!.toString());
|
fontSize: 24.0,
|
||||||
final String itemTitle = curr.name;
|
decoration: TextDecoration.underline,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
final String itemAmount;
|
|
||||||
if (curr.frequency != null) {
|
|
||||||
itemAmount =
|
|
||||||
"${curr.amount.toStringAsFixed(2)} ${curr.frequency!.title}";
|
|
||||||
} else {
|
|
||||||
itemAmount = curr.amount.toStringAsFixed(2);
|
|
||||||
}
|
|
||||||
final String itemDescription = curr.description;
|
|
||||||
|
|
||||||
final double itemDayAmount, itemMonthAmount, itemYearAmount;
|
|
||||||
final String estimateSymbolDaily,
|
|
||||||
estimateSymbolMonthly,
|
|
||||||
estimateSymbolYearly;
|
|
||||||
|
|
||||||
if (curr.frequency != null) {
|
|
||||||
itemDayAmount = curr.calcComparableAmountDaily();
|
|
||||||
estimateSymbolDaily = curr.frequency!.numDays
|
|
||||||
.toStringAsFixed(2)
|
|
||||||
.endsWith(".00") &&
|
|
||||||
itemDayAmount.toStringAsFixed(3).endsWith("0")
|
|
||||||
? ""
|
|
||||||
: "~";
|
|
||||||
|
|
||||||
itemMonthAmount =
|
|
||||||
(curr.calcComparableAmountYearly() / 12);
|
|
||||||
estimateSymbolMonthly = curr.frequency!.timesPerYear
|
|
||||||
.toStringAsFixed(2)
|
|
||||||
.endsWith(".00") &&
|
|
||||||
itemMonthAmount.toStringAsFixed(3).endsWith("0")
|
|
||||||
? ""
|
|
||||||
: "~";
|
|
||||||
|
|
||||||
itemYearAmount = curr.calcComparableAmountYearly();
|
|
||||||
estimateSymbolYearly = curr.frequency!.timesPerYear
|
|
||||||
.toStringAsFixed(2)
|
|
||||||
.endsWith(".00") &&
|
|
||||||
itemYearAmount.toStringAsFixed(3).endsWith("0")
|
|
||||||
? ""
|
|
||||||
: "~";
|
|
||||||
} else {
|
|
||||||
itemDayAmount = -1;
|
|
||||||
estimateSymbolDaily = "";
|
|
||||||
itemMonthAmount = curr.amount;
|
|
||||||
estimateSymbolMonthly = "";
|
|
||||||
itemYearAmount = -1;
|
|
||||||
estimateSymbolYearly = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
final String monthlyTitle = curr.type == ItemType.asset
|
|
||||||
? ""
|
|
||||||
: " ${Frequency.monthly.title}";
|
|
||||||
|
|
||||||
final String itemTopText = itemDayAmount < 0
|
|
||||||
? ""
|
|
||||||
: "$estimateSymbolDaily${itemDayAmount.toStringAsFixed(2)} ${Frequency.daily.title}";
|
|
||||||
final String itemMiddleText = itemMonthAmount < 0
|
|
||||||
? ""
|
|
||||||
: "$estimateSymbolMonthly${itemMonthAmount.toStringAsFixed(2)}$monthlyTitle";
|
|
||||||
final String itemBottomText = itemYearAmount < 0
|
|
||||||
? ""
|
|
||||||
: "$estimateSymbolYearly${itemYearAmount.toStringAsFixed(2)} ${Frequency.yearly.title}";
|
|
||||||
|
|
||||||
return Padding(
|
|
||||||
padding: const EdgeInsets.all(4.0),
|
|
||||||
child: Dismissible(
|
|
||||||
key: itemKey,
|
|
||||||
background: Container(
|
|
||||||
color: Colors.red,
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Icon(Icons.delete),
|
|
||||||
Text("Delete"),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
secondaryBackground: Container(
|
|
||||||
color: Colors.orange,
|
|
||||||
child: Row(
|
|
||||||
mainAxisAlignment: MainAxisAlignment.end,
|
|
||||||
children: [
|
|
||||||
Text("Edit"),
|
|
||||||
Icon(Icons.edit),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onDismissed: (direction) {
|
|
||||||
setState(() {
|
|
||||||
snapshot.data!.remove(curr);
|
|
||||||
switch (direction) {
|
|
||||||
case DismissDirection.startToEnd:
|
|
||||||
// Remove the item from the database.
|
|
||||||
if (curr is Expense) {
|
|
||||||
DatabaseHelper.instance.removeExpense(
|
|
||||||
curr.id!,
|
|
||||||
);
|
|
||||||
} else if (curr is Income) {
|
|
||||||
DatabaseHelper.instance.removeIncome(
|
|
||||||
curr.id!,
|
|
||||||
);
|
|
||||||
} else if (curr is Asset) {
|
|
||||||
DatabaseHelper.instance.removeAsset(
|
|
||||||
curr.id!,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
throw UnimplementedError(
|
|
||||||
"Cannot remove unimplemented item type.");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case DismissDirection.endToStart:
|
|
||||||
// Open an edit dialog, then remove the item from the list.
|
|
||||||
showDialog(
|
|
||||||
context: context,
|
|
||||||
builder: (_) => AlertDialog(
|
|
||||||
content: TrackedItemInputDialog(
|
|
||||||
notifyParent: widget.notifyParent,
|
|
||||||
entry: curr,
|
|
||||||
amountText: curr.getAmountText(),
|
|
||||||
type: curr.type!,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
UnimplementedError(
|
|
||||||
"Direction ${direction.toString()} not recognized.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: Container(
|
|
||||||
decoration: BoxDecoration(
|
|
||||||
borderRadius: BorderRadius.circular(4),
|
|
||||||
color: theme.colorScheme.onPrimary,
|
|
||||||
),
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.all(4.0),
|
|
||||||
child: Row(
|
|
||||||
mainAxisSize: MainAxisSize.max,
|
|
||||||
children: [
|
|
||||||
Column(
|
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
itemTitle,
|
|
||||||
style: TextStyle(fontSize: 20.0),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
itemAmount,
|
|
||||||
style: TextStyle(fontSize: 12.0),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
Expanded(
|
|
||||||
child: Center(
|
|
||||||
child: Text(
|
|
||||||
itemDescription,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: 12.0,
|
|
||||||
),
|
|
||||||
softWrap: true,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.end,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
itemTopText,
|
|
||||||
style: TextStyle(fontSize: 12.0),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
itemMiddleText,
|
|
||||||
style: TextStyle(fontSize: 12.0),
|
|
||||||
),
|
|
||||||
Text(
|
|
||||||
itemBottomText,
|
|
||||||
style: TextStyle(fontSize: 12.0),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
),
|
||||||
},
|
/*Text(
|
||||||
|
"${widget.assetType.description}",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 16.0,
|
||||||
|
decoration: TextDecoration.none,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),*/
|
||||||
|
Expanded(
|
||||||
|
child: ListView.builder(
|
||||||
|
itemCount: snapshot.data!.length,
|
||||||
|
itemBuilder: (_, index) {
|
||||||
|
final TrackedItem curr = snapshot.data![index];
|
||||||
|
|
||||||
|
final itemKey = Key(curr.id!.toString());
|
||||||
|
final String itemTitle = curr.name;
|
||||||
|
|
||||||
|
final String itemAmount;
|
||||||
|
if (curr.frequency != null) {
|
||||||
|
itemAmount =
|
||||||
|
"${curr.amount.toStringAsFixed(2)} ${curr.frequency!.title}";
|
||||||
|
} else {
|
||||||
|
itemAmount = curr.amount.toStringAsFixed(2);
|
||||||
|
}
|
||||||
|
final String itemDescription = curr.description;
|
||||||
|
|
||||||
|
final double itemDayAmount,
|
||||||
|
itemMonthAmount,
|
||||||
|
itemYearAmount;
|
||||||
|
final String estimateSymbolDaily,
|
||||||
|
estimateSymbolMonthly,
|
||||||
|
estimateSymbolYearly;
|
||||||
|
|
||||||
|
if (curr.frequency != null) {
|
||||||
|
itemDayAmount = curr.calcComparableAmountDaily();
|
||||||
|
estimateSymbolDaily = curr.frequency!.numDays
|
||||||
|
.toStringAsFixed(2)
|
||||||
|
.endsWith(".00") &&
|
||||||
|
itemDayAmount
|
||||||
|
.toStringAsFixed(3)
|
||||||
|
.endsWith("0")
|
||||||
|
? ""
|
||||||
|
: "~";
|
||||||
|
|
||||||
|
itemMonthAmount =
|
||||||
|
(curr.calcComparableAmountYearly() / 12);
|
||||||
|
estimateSymbolMonthly = curr.frequency!.timesPerYear
|
||||||
|
.toStringAsFixed(2)
|
||||||
|
.endsWith(".00") &&
|
||||||
|
itemMonthAmount
|
||||||
|
.toStringAsFixed(3)
|
||||||
|
.endsWith("0")
|
||||||
|
? ""
|
||||||
|
: "~";
|
||||||
|
|
||||||
|
itemYearAmount = curr.calcComparableAmountYearly();
|
||||||
|
estimateSymbolYearly = curr.frequency!.timesPerYear
|
||||||
|
.toStringAsFixed(2)
|
||||||
|
.endsWith(".00") &&
|
||||||
|
itemYearAmount
|
||||||
|
.toStringAsFixed(3)
|
||||||
|
.endsWith("0")
|
||||||
|
? ""
|
||||||
|
: "~";
|
||||||
|
} else {
|
||||||
|
itemDayAmount = -1;
|
||||||
|
estimateSymbolDaily = "";
|
||||||
|
itemMonthAmount = curr.amount;
|
||||||
|
estimateSymbolMonthly = "";
|
||||||
|
itemYearAmount = -1;
|
||||||
|
estimateSymbolYearly = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
final String monthlyTitle =
|
||||||
|
curr.type == ItemType.asset
|
||||||
|
? ""
|
||||||
|
: " ${Frequency.monthly.title}";
|
||||||
|
|
||||||
|
final String itemTopText = itemDayAmount < 0
|
||||||
|
? ""
|
||||||
|
: "$estimateSymbolDaily${itemDayAmount.toStringAsFixed(2)} ${Frequency.daily.title}";
|
||||||
|
final String itemMiddleText = itemMonthAmount < 0
|
||||||
|
? ""
|
||||||
|
: "$estimateSymbolMonthly${itemMonthAmount.toStringAsFixed(2)}$monthlyTitle";
|
||||||
|
final String itemBottomText = itemYearAmount < 0
|
||||||
|
? ""
|
||||||
|
: "$estimateSymbolYearly${itemYearAmount.toStringAsFixed(2)} ${Frequency.yearly.title}";
|
||||||
|
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.all(4.0),
|
||||||
|
child: Dismissible(
|
||||||
|
key: itemKey,
|
||||||
|
background: Container(
|
||||||
|
color: Colors.red,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Icon(Icons.delete),
|
||||||
|
Text("Delete"),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
secondaryBackground: Container(
|
||||||
|
color: Colors.orange,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
Text("Edit"),
|
||||||
|
Icon(Icons.edit),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onDismissed: (direction) {
|
||||||
|
setState(() {
|
||||||
|
snapshot.data!.remove(curr);
|
||||||
|
switch (direction) {
|
||||||
|
case DismissDirection.startToEnd:
|
||||||
|
// Remove the item from the database.
|
||||||
|
if (curr is Expense) {
|
||||||
|
DatabaseHelper.instance.removeExpense(
|
||||||
|
curr.id!,
|
||||||
|
);
|
||||||
|
} else if (curr is Income) {
|
||||||
|
DatabaseHelper.instance.removeIncome(
|
||||||
|
curr.id!,
|
||||||
|
);
|
||||||
|
} else if (curr is Asset) {
|
||||||
|
DatabaseHelper.instance.removeAsset(
|
||||||
|
curr.id!,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
throw UnimplementedError(
|
||||||
|
"Cannot remove unimplemented item type.");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DismissDirection.endToStart:
|
||||||
|
// Open an edit dialog, then remove the item from the list.
|
||||||
|
showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (_) => AlertDialog(
|
||||||
|
content: TrackedItemInputDialog(
|
||||||
|
notifyParent: widget.notifyParent,
|
||||||
|
entry: curr,
|
||||||
|
amountText: curr.getAmountText(),
|
||||||
|
type: curr.type!,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
UnimplementedError(
|
||||||
|
"Direction ${direction.toString()} not recognized.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(4),
|
||||||
|
color: theme.colorScheme.onPrimary,
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(4.0),
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.max,
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
itemTitle,
|
||||||
|
style: TextStyle(fontSize: 20.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
itemAmount,
|
||||||
|
style: TextStyle(fontSize: 12.0),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: Center(
|
||||||
|
child: Text(
|
||||||
|
itemDescription,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 12.0,
|
||||||
|
),
|
||||||
|
softWrap: true,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Column(
|
||||||
|
crossAxisAlignment:
|
||||||
|
CrossAxisAlignment.end,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
|
itemTopText,
|
||||||
|
style: TextStyle(fontSize: 12.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
itemMiddleText,
|
||||||
|
style: TextStyle(fontSize: 12.0),
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
itemBottomText,
|
||||||
|
style: TextStyle(fontSize: 12.0),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user