freekake basename

This commit is contained in:
='fauz
2025-05-07 13:56:17 +07:00
parent 4dad153d28
commit f47eb88980
34 changed files with 1010 additions and 995 deletions
+12 -12
View File
@@ -93,7 +93,7 @@ img {
border-radius: 4px; border-radius: 4px;
} }
.bahan-container { .div-grid {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
@@ -101,21 +101,21 @@ img {
margin: 20px 0; margin: 20px 0;
} }
.bahan-item { .div-item {
text-align: center; text-align: center;
flex: 1 0 calc(25% - 15px); /* 4 items per row by default */ flex: 1 0 calc(25% - 15px); /* 4 items per row by default */
min-width: calc(25% - 15px); min-width: calc(25% - 15px);
max-width: calc(25% - 15px); max-width: calc(25% - 15px);
} }
.bahan-item img { .div-item img {
width: 100%; width: 100%;
height: 120px; height: 120px;
object-fit: cover; object-fit: cover;
border-radius: 8px; border-radius: 8px;
} }
.bahan-item p { .div-item p {
margin-top: 8px; margin-top: 8px;
font-size: 0.9em; font-size: 0.9em;
} }
@@ -138,7 +138,7 @@ figcaption {
/* Tablet Size (768px and below) - 2 items per row */ /* Tablet Size (768px and below) - 2 items per row */
@media (max-width: 768px) { @media (max-width: 768px) {
.bahan-item { .div-item {
flex: 1 0 calc(50% - 15px); flex: 1 0 calc(50% - 15px);
min-width: calc(50% - 15px); min-width: calc(50% - 15px);
max-width: calc(50% - 15px); max-width: calc(50% - 15px);
@@ -171,7 +171,7 @@ figcaption {
padding: 15px; padding: 15px;
} }
.bahan-item { .div-item {
flex: 1 0 100%; flex: 1 0 100%;
min-width: 100%; min-width: 100%;
max-width: 100%; max-width: 100%;
@@ -222,20 +222,20 @@ figcaption {
<h2>Apa Saja Isi Furikake?</h2> <h2>Apa Saja Isi Furikake?</h2>
<p>Furikake biasanya terbuat dari campuran beberapa bahan seperti:</p> <p>Furikake biasanya terbuat dari campuran beberapa bahan seperti:</p>
<div class="bahan-container"> <div class="div-grid">
<div class="bahan-item"> <div class="div-item">
<img src="assets/html/furikake/nori.jpeg" alt="Nori"> <img src="assets/html/furikake/nori.jpeg" alt="Nori">
<p>Nori (Rumput Laut)</p> <p>Nori (Rumput Laut)</p>
</div> </div>
<div class="bahan-item"> <div class="div-item">
<img src="assets/html/furikake/wijen.jpeg" alt="Biji Wijen"> <img src="assets/html/furikake/wijen.jpeg" alt="Biji Wijen">
<p>Biji Wijen</p> <p>Biji Wijen</p>
</div> </div>
<div class="bahan-item"> <div class="div-item">
<img src="assets/html/furikake/ikankering.jpg" alt="Katsuobushi"> <img src="assets/html/furikake/ikankering.jpg" alt="Katsuobushi">
<p>Katsuobushi (Ikan Kering)</p> <p>Katsuobushi (Ikan Kering)</p>
</div> </div>
<div class="bahan-item"> <div class="div-item">
<img src="assets/html/furikake/gulagaram.jpg" alt="Garam dan Gula"> <img src="assets/html/furikake/gulagaram.jpg" alt="Garam dan Gula">
<p>Garam & Gula</p> <p>Garam & Gula</p>
</div> </div>
@@ -259,7 +259,7 @@ figcaption {
</ul> </ul>
<figure> <figure>
<img src="furikake.jpg" alt="Contoh produk furikake" class="full-width-image"> <img src="assets/html/furikake/furikake.jpg" alt="Contoh produk furikake" class="full-width-image">
<figcaption>Berbagai varian produk furikake yang tersedia di pasaran</figcaption> <figcaption>Berbagai varian produk furikake yang tersedia di pasaran</figcaption>
</figure> </figure>
</section> </section>
+11 -11
View File
@@ -92,7 +92,7 @@
border-radius: 4px; border-radius: 4px;
} }
.gizi-grid { .div-grid {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
@@ -100,13 +100,13 @@
margin-top: 5px; margin-top: 5px;
} }
.gizi-item { .div-item {
text-align: center; text-align: center;
max-width: 100px; max-width: 100px;
flex: 1 1 200px; flex: 1 1 200px;
} }
.gizi-item img { .div-item img {
width: 100%; width: 100%;
height: auto; height: auto;
border-radius: 10px; border-radius: 10px;
@@ -148,12 +148,12 @@
padding: 15px; padding: 15px;
} }
.gizi-grid { .div-grid {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
.gizi-item { .div-item {
max-width: 80%; max-width: 80%;
} }
} }
@@ -175,24 +175,24 @@
<h2>Apa Itu Gizi Seimbang?</h2> <h2>Apa Itu Gizi Seimbang?</h2>
<p>Gizi seimbang adalah cara makan yang mengandung semua zat gizi yang dibutuhkan tubuh. Zat gizi itu terdiri dari:</p> <p>Gizi seimbang adalah cara makan yang mengandung semua zat gizi yang dibutuhkan tubuh. Zat gizi itu terdiri dari:</p>
<div class="gizi-grid"> <div class="div-grid">
<div class="gizi-item"> <div class="div-item">
<img src="assets/html/karbohidrat.png" alt="Karbohidrat" /> <img src="assets/html/karbohidrat.png" alt="Karbohidrat" />
<p><strong>Karbohidrat</strong><br>Sumber energi seperti nasi, roti, dan kentang.</p> <p><strong>Karbohidrat</strong><br>Sumber energi seperti nasi, roti, dan kentang.</p>
</div> </div>
<div class="gizi-item"> <div class="div-item">
<img src="assets/html/protein.png" alt="Protein" /> <img src="assets/html/protein.png" alt="Protein" />
<p><strong>Protein</strong><br>Untuk membangun otot, misalnya ikan, telur, dan tahu.</p> <p><strong>Protein</strong><br>Untuk membangun otot, misalnya ikan, telur, dan tahu.</p>
</div> </div>
<div class="gizi-item"> <div class="div-item">
<img src="assets/html/lemak.png" alt="Lemak" /> <img src="assets/html/lemak.png" alt="Lemak" />
<p><strong>Lemak</strong><br>Memberikan tenaga, seperti dari kacang-kacangan dan minyak sehat.</p> <p><strong>Lemak</strong><br>Memberikan tenaga, seperti dari kacang-kacangan dan minyak sehat.</p>
</div> </div>
<div class="gizi-item"> <div class="div-item">
<img src="assets/html/vitaminmineral.png" alt="Vitamin dan Mineral" /> <img src="assets/html/vitaminmineral.png" alt="Vitamin dan Mineral" />
<p><strong>Vitamin dan mineral</strong><br>Dari sayur dan buah yang membantu tubuh bekerja dengan baik.</p> <p><strong>Vitamin dan mineral</strong><br>Dari sayur dan buah yang membantu tubuh bekerja dengan baik.</p>
</div> </div>
<div class="gizi-item"> <div class="div-item">
<img src="assets/html/seratair.png" alt="Serat dan Air" /> <img src="assets/html/seratair.png" alt="Serat dan Air" />
<p><strong>Serat dan air</strong><br>Membantu pencernaan dan menjaga tubuh tetap segar!</p> <p><strong>Serat dan air</strong><br>Membantu pencernaan dan menjaga tubuh tetap segar!</p>
</div> </div>
+2 -5
View File
@@ -1,9 +1,5 @@
import 'package:freekake/components/navbar_shape_3.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/navbar_container.dart';
import 'package:furibase/components/navbar_shape_1.dart';
import 'package:furibase/components/navbar_shape_2.dart';
import 'package:furibase/components/navbar_shape_3.dart';
import 'package:furibase/components/custom_shape.dart';
class BottomNavbar extends StatefulWidget { class BottomNavbar extends StatefulWidget {
const BottomNavbar({super.key}); const BottomNavbar({super.key});
@@ -13,6 +9,7 @@ class BottomNavbar extends StatefulWidget {
} }
class _BottomNavbarState extends State<BottomNavbar> { class _BottomNavbarState extends State<BottomNavbar> {
@override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final Size screenSize = MediaQuery.of(context).size; final Size screenSize = MediaQuery.of(context).size;
return CustomPaint( return CustomPaint(
+1 -1
View File
@@ -34,7 +34,7 @@ class CardList extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Text(
this.title, title,
style: const TextStyle( style: const TextStyle(
fontSize: 14, fontSize: 14,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
+2 -2
View File
@@ -17,7 +17,7 @@ class CollectionContainer extends StatelessWidget {
final bool? small; final bool? small;
const CollectionContainer({ const CollectionContainer({
Key? key, super.key,
this.label, this.label,
this.imagesrc, this.imagesrc,
this.imageSvg, this.imageSvg,
@@ -31,7 +31,7 @@ class CollectionContainer extends StatelessWidget {
this.circle, this.circle,
this.colorContiner, this.colorContiner,
this.small, this.small,
}) : super(key: key); });
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
+2 -1
View File
@@ -6,6 +6,7 @@ class CurvedBottomBorderTab extends StatelessWidget {
final VoidCallback tap; final VoidCallback tap;
const CurvedBottomBorderTab({ const CurvedBottomBorderTab({
super.key,
required this.isSelected, required this.isSelected,
required this.label, required this.label,
required this.tap, required this.tap,
@@ -16,6 +17,7 @@ class CurvedBottomBorderTab extends StatelessWidget {
return CustomPaint( return CustomPaint(
painter: isSelected ? CurvedBottomPainter() : null, painter: isSelected ? CurvedBottomPainter() : null,
child: GestureDetector( child: GestureDetector(
onTap: tap,
child: Container( child: Container(
width: 110, width: 110,
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
@@ -34,7 +36,6 @@ class CurvedBottomBorderTab extends StatelessWidget {
), ),
), ),
), ),
onTap: tap,
), ),
); );
} }
+10 -10
View File
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/navbar_shape_2.dart'; // import 'package:freekake/components/navbar_shape_2.dart';
class CustomShape extends StatelessWidget { class CustomShape extends StatelessWidget {
const CustomShape({super.key}); const CustomShape({super.key});
@@ -23,7 +23,7 @@ class RPSCustomPainter extends CustomPainter {
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
// Layer 1 // Layer 1
Paint paint_fill_0 = Paint paintFill0 =
Paint() Paint()
..color = const Color.fromARGB(255, 189, 18, 18) ..color = const Color.fromARGB(255, 189, 18, 18)
..style = PaintingStyle.fill ..style = PaintingStyle.fill
@@ -67,11 +67,11 @@ class RPSCustomPainter extends CustomPainter {
); );
path_0.close(); path_0.close();
canvas.drawPath(path_0, paint_fill_0); canvas.drawPath(path_0, paintFill0);
// Layer 1 // Layer 1
Paint paint_stroke_0 = Paint paintStroke0 =
Paint() Paint()
..color = const Color.fromARGB(255, 33, 150, 243) ..color = const Color.fromARGB(255, 33, 150, 243)
..style = PaintingStyle.stroke ..style = PaintingStyle.stroke
@@ -79,11 +79,11 @@ class RPSCustomPainter extends CustomPainter {
..strokeCap = StrokeCap.butt ..strokeCap = StrokeCap.butt
..strokeJoin = StrokeJoin.miter; ..strokeJoin = StrokeJoin.miter;
canvas.drawPath(path_0, paint_stroke_0); canvas.drawPath(path_0, paintStroke0);
// Layer 1 // Layer 1
Paint paint_fill_1 = Paint paintFill1 =
Paint() Paint()
..color = const Color.fromARGB(255, 28, 163, 52) ..color = const Color.fromARGB(255, 28, 163, 52)
..style = PaintingStyle.fill ..style = PaintingStyle.fill
@@ -116,11 +116,11 @@ class RPSCustomPainter extends CustomPainter {
); );
path_1.close(); path_1.close();
canvas.drawPath(path_1, paint_fill_1); canvas.drawPath(path_1, paintFill1);
// Layer 1 // Layer 1
Paint paint_stroke_1 = Paint paintStroke1 =
Paint() Paint()
..color = const Color.fromARGB(255, 33, 150, 243) ..color = const Color.fromARGB(255, 33, 150, 243)
..style = PaintingStyle.stroke ..style = PaintingStyle.stroke
@@ -128,7 +128,7 @@ class RPSCustomPainter extends CustomPainter {
..strokeCap = StrokeCap.butt ..strokeCap = StrokeCap.butt
..strokeJoin = StrokeJoin.miter; ..strokeJoin = StrokeJoin.miter;
canvas.drawPath(path_1, paint_stroke_1); canvas.drawPath(path_1, paintStroke1);
// layer 2 // layer 2
// Paint paint_fill_0 = // Paint paint_fill_0 =
@@ -164,7 +164,7 @@ class RPSCustomPainter extends CustomPainter {
); );
path_0.close(); path_0.close();
canvas.drawPath(path_0, paint_fill_0); canvas.drawPath(path_0, paintFill0);
// Layer 1 // Layer 1
+7 -8
View File
@@ -1,16 +1,15 @@
import 'package:freekake/components/menu_button.dart';
import 'package:freekake/providers/menu_selection_provider.dart';
import 'package:freekake/screen/Home_screen.dart';
import 'package:freekake/screen/koleksi_screen.dart';
import 'package:freekake/screen/pustaka_screen.dart';
import 'package:freekake/screen/saya/profile_screen.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/bottom_navbar.dart';
import 'package:furibase/components/menu_button.dart';
import 'package:furibase/components/scan_button.dart';
import 'package:furibase/providers/menu_selection_provider.dart';
import 'package:furibase/screen/Home_screen.dart';
import 'package:furibase/screen/koleksi_screen.dart';
import 'package:furibase/screen/pustaka_screen.dart';
import 'package:furibase/screen/saya/profile_screen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class MainMenu extends StatefulWidget { class MainMenu extends StatefulWidget {
const MainMenu({super.key}); const MainMenu({super.key});
@override
_MainMenuState createState() => _MainMenuState(); _MainMenuState createState() => _MainMenuState();
} }
+1 -2
View File
@@ -1,5 +1,4 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/navbar_shape_2.dart';
class NavbarContainer extends StatelessWidget { class NavbarContainer extends StatelessWidget {
const NavbarContainer({super.key}); const NavbarContainer({super.key});
@@ -23,7 +22,7 @@ class MyShape extends CustomPainter {
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
// TODO: implement paint // TODO: implement paint
Paint paint = Paint paint =
new Paint() Paint()
..color = const Color.fromARGB(255, 166, 12, 66) ..color = const Color.fromARGB(255, 166, 12, 66)
..style = PaintingStyle.fill; ..style = PaintingStyle.fill;
+1 -1
View File
@@ -7,7 +7,7 @@ class BNBCustomPainter2 extends CustomPainter {
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
debugPrint("Drawing navbar..."); debugPrint("Drawing navbar...");
Paint paint = Paint paint =
new Paint() Paint()
..color = const Color.fromARGB(255, 79, 76, 182) ..color = const Color.fromARGB(255, 79, 76, 182)
..style = PaintingStyle.fill; ..style = PaintingStyle.fill;
+1 -1
View File
@@ -7,7 +7,7 @@ class BNBCustomPainter3 extends CustomPainter {
void paint(Canvas canvas, Size size) { void paint(Canvas canvas, Size size) {
debugPrint("Drawing navbar..."); debugPrint("Drawing navbar...");
Paint paint = Paint paint =
new Paint() Paint()
..color = const Color.fromARGB(255, 79, 76, 182) ..color = const Color.fromARGB(255, 79, 76, 182)
..style = PaintingStyle.fill; ..style = PaintingStyle.fill;
+3 -2
View File
@@ -1,10 +1,11 @@
import 'package:freekake/screen/camera_screen.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:furibase/screen/camera_screen.dart'; // import 'package:freekake/screen/camera_screen.dart';
class ScanButton extends StatelessWidget { class ScanButton extends StatelessWidget {
const ScanButton({super.key}); const ScanButton({super.key});
static const Color transparent = Color(0xFFFFFFF); static const Color transparent = Color(0x0fffffff);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
+1
View File
@@ -8,6 +8,7 @@ class TopbarContainer extends StatefulWidget {
} }
class _TopbarContainerState extends State<TopbarContainer> { class _TopbarContainerState extends State<TopbarContainer> {
@override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final Size size = MediaQuery.of(context).size; final Size size = MediaQuery.of(context).size;
return Container( return Container(
+3 -3
View File
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:furibase/providers/character_provider.dart'; import 'package:freekake/providers/character_provider.dart';
import 'package:furibase/providers/menu_selection_provider.dart'; import 'package:freekake/providers/menu_selection_provider.dart';
import 'package:furibase/screen/Home_screen.dart'; import 'package:freekake/screen/Home_screen.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
void main() async { void main() async {
+209 -230
View File
@@ -1,12 +1,12 @@
import 'package:dropdown_button2/dropdown_button2.dart'; import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/bottom_navbar.dart'; import 'package:freekake/components/bottom_navbar.dart';
import 'package:furibase/components/buildcard_info.dart'; import 'package:freekake/components/buildcard_info.dart';
import 'package:furibase/components/main_menu.dart'; import 'package:freekake/components/main_menu.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
class HomeScreen extends StatefulWidget { class HomeScreen extends StatefulWidget {
HomeScreen({super.key}); const HomeScreen({super.key});
@override @override
State<HomeScreen> createState() => _HomeScreenState(); State<HomeScreen> createState() => _HomeScreenState();
@@ -14,7 +14,7 @@ class HomeScreen extends StatefulWidget {
class _HomeScreenState extends State<HomeScreen> { class _HomeScreenState extends State<HomeScreen> {
final String username = "User01"; final String username = "User01";
double _sliderValue = 0.0; final double _sliderValue = 0.0;
static const Color transparent = Color(0xFFFFFFFF); static const Color transparent = Color(0xFFFFFFFF);
// Image image // Image image
@@ -77,235 +77,214 @@ class _HomeScreenState extends State<HomeScreen> {
// ], // ],
// ), // ),
// ), // ),
body: Stack( body: homeBody(
children: <Widget>[ context,
Positioned.fill( isLandscape,
child: RepaintBoundary( bottomOffset,
child: Container( bottomPadding,
decoration: const BoxDecoration( screenWidth,
image: const DecorationImage( buttonScanSize,
image: AssetImage("assets/images/background.jpeg"),
fit: BoxFit.cover,
),
),
),
),
),
// Positioned(
// top: 0,
// left: 0,
// right: 0,
// child: SizedBox(height: 120, child: TopbarContainer()),
// ),
Positioned(
right: 0,
top: 100,
child: Padding(
padding: EdgeInsets.only(right: 20),
child: Container(
width: 40,
height: 40,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(1),
color: Color.fromARGB(1, 209, 174, 174).withAlpha(0),
),
child: Center(
child: DropdownButtonHideUnderline(
child: DropdownButton2(
customButton: Container(
height: 50,
width: 50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
image: const DecorationImage(
image: AssetImage('assets/images/luffy-u.png'),
fit: BoxFit.cover,
),
),
),
openWithLongPress: false,
items: [
..._MenuItems.firstItems.map(
(item) => DropdownMenuItem<_MenuItem>(
value: item,
child: _MenuItems.buildItem(item),
),
),
// const DropdownMenuItem<Divider>(
// enabled: false,
// // height: 8,
// child: Divider(),
// ),
// ..._MenuItems.secondItems.map(
// (item) => DropdownMenuItem<_MenuItem>(
// value: item,
// // height: 48,
// child: _MenuItems.buildItem(item),
// ),
// ),
],
onChanged: (value) {
if (value != null) {
_MenuItems.onChanged(context, value);
} else {
print("null");
}
},
buttonStyleData: ButtonStyleData(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(40),
),
),
dropdownStyleData: DropdownStyleData(
width: 140,
padding: EdgeInsets.zero,
maxHeight: 150,
// padding: const EdgeInsets.symmetric(vertical: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Color.fromRGBO(2, 104, 17, 1).withAlpha(50),
),
offset: const Offset(40, -4),
),
menuItemStyleData: MenuItemStyleData(
height: 35,
padding: EdgeInsets.symmetric(horizontal: 10),
),
// menuItemStyleData: const MenuItemStyleData(
// padding: EdgeInsets.only(left: 16, right: 16),
// ),
),
),
),
),
),
),
Positioned(
top: 10,
left: 10,
right: 10,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BuildcardInfo(
icon: Icons.person,
text: username,
extraIcon: Icons.emoji_events,
extraText: "5000",
width: 180,
),
BuildcardInfo(
icon: Icons.monetization_on,
text: "1.300",
width: 90,
),
],
),
),
Positioned(
bottom: 150,
left: 0,
right: 0,
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration(
color: Color.fromARGB(255, 247, 224, 236),
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Color.fromARGB(255, 214, 213, 121),
blurRadius: 5,
spreadRadius: 2,
),
],
),
child: Text(
"Halo....Jotaslim",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
color: Color(0xFF000000),
),
),
),
SizedBox(height: 10),
setHomeImage("assets/images/luffy.png", 300),
],
),
),
// BG MEnu
Stack(
children: [
Positioned(
bottom: 0,
left: 0,
right: 0,
child: SizedBox(height: 85, child: BottomNavbar()),
),
],
),
Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()),
Positioned(
// bottom: -150, //bottomPadding * 32,
// bottom: sunRiseCurve(
// screenWidth,
// ),
bottom:
isLandscape
? bottomOffset.clamp(-200.0, -50.0)
: bottomPadding * 55,
left: (screenWidth - buttonScanSize) / 2,
child: Transform.translate(
offset: Offset(0, -30),
child: ScanButton(),
),
),
],
), ),
); );
} }
// Widget _menuButton(String label, Widget icon) { Stack homeBody(
// return Expanded( BuildContext context,
// child: Column( bool isLandscape,
// children: [ double bottomOffset,
// IconButton( double bottomPadding,
// // icon: Icon(icon, color: Color.fromARGB(255, 179, 161, 170)), double screenWidth,
// icon: icon, double buttonScanSize,
// onPressed: () {}, ) {
// ), return Stack(
// Text( children: <Widget>[
// label, Positioned.fill(
// style: TextStyle( child: RepaintBoundary(
// color: Color.fromARGB(255, 239, 224, 232), child: Container(
// fontWeight: FontWeight.bold, decoration: const BoxDecoration(
// ), image: DecorationImage(
// ), image: AssetImage("assets/images/background.jpeg"),
// ], fit: BoxFit.cover,
// ), ),
// ); ),
// } ),
),
),
// Positioned(
// top: 0,
// left: 0,
// right: 0,
// child: SizedBox(height: 120, child: TopbarContainer()),
// ),
Positioned(
right: 0,
top: 100,
child: Padding(
padding: EdgeInsets.only(right: 20),
child: Container(
width: 40,
height: 40,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(1),
color: Color.fromARGB(1, 209, 174, 174).withAlpha(0),
),
child: Center(
child: DropdownButtonHideUnderline(
child: DropdownButton2(
customButton: Container(
height: 50,
width: 50,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
image: const DecorationImage(
image: AssetImage('assets/images/luffy-u.png'),
fit: BoxFit.cover,
),
),
),
openWithLongPress: false,
items: [
..._MenuItems.firstItems.map(
(item) => DropdownMenuItem<_MenuItem>(
value: item,
child: _MenuItems.buildItem(item),
),
),
// const DropdownMenuItem<Divider>(
// enabled: false,
// // height: 8,
// child: Divider(),
// ),
// ..._MenuItems.secondItems.map(
// (item) => DropdownMenuItem<_MenuItem>(
// value: item,
// // height: 48,
// child: _MenuItems.buildItem(item),
// ),
// ),
],
onChanged: (value) {
if (value != null) {
_MenuItems.onChanged(context, value);
} else {
print("null");
}
},
buttonStyleData: ButtonStyleData(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(40),
),
),
dropdownStyleData: DropdownStyleData(
width: 140,
padding: EdgeInsets.zero,
maxHeight: 150,
// padding: const EdgeInsets.symmetric(vertical: 6),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(4),
color: Color.fromRGBO(2, 104, 17, 1).withAlpha(50),
),
offset: const Offset(40, -4),
),
menuItemStyleData: MenuItemStyleData(
height: 35,
padding: EdgeInsets.symmetric(horizontal: 10),
),
// menuItemStyleData: const MenuItemStyleData(
// padding: EdgeInsets.only(left: 16, right: 16),
// ),
),
),
),
),
),
),
Positioned(
top: 10,
left: 10,
right: 10,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BuildcardInfo(
icon: Icons.person,
text: username,
extraIcon: Icons.emoji_events,
extraText: "5000",
width: 180,
),
BuildcardInfo(
icon: Icons.monetization_on,
text: "1.300",
width: 90,
),
],
),
),
Positioned(
bottom: 150,
left: 0,
right: 0,
child: Column(
children: [
Container(
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
decoration: BoxDecoration(
color: Color.fromARGB(255, 247, 224, 236),
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: Color.fromARGB(255, 214, 213, 121),
blurRadius: 5,
spreadRadius: 2,
),
],
),
child: Text(
"Halo....Jotaslim",
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
color: Color(0xFF000000),
),
),
),
SizedBox(height: 10),
setHomeImage("assets/images/luffy.png", 300),
],
),
),
// BG MEnu
Stack(
children: [
Positioned(
bottom: 0,
left: 0,
right: 0,
child: SizedBox(height: 85, child: BottomNavbar()),
),
],
),
Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()),
// Widget _scanButton() { Positioned(
// return Expanded( // bottom: -150, //bottomPadding * 32,
// child: Container( // bottom: sunRiseCurve(
// decoration: BoxDecoration(shape: BoxShape.circle, color: transparent), // screenWidth,
// padding: EdgeInsets.all(10), // ),
// child: IconButton( bottom:
// icon: SvgPicture.asset( isLandscape
// 'icons/Scan.svg', ? bottomOffset.clamp(-200.0, -50.0)
// width: 60, : bottomPadding * 55,
// height: 60, left: (screenWidth - buttonScanSize) / 2,
// colorFilter: ColorFilter.mode(Color(0xFFFFFFFF), BlendMode.srcIn), child: Transform.translate(
// ), offset: Offset(0, -30),
// onPressed: () {}, child: ScanButton(),
// ), ),
// ), ),
// ); ],
// } );
}
Widget setHomeImage(String src, double size) { Widget setHomeImage(String src, double size) {
return Image.asset(src, width: size); return Image.asset(src, width: size);
+2
View File
@@ -5,6 +5,8 @@ import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
class CameraScreen extends StatefulWidget { class CameraScreen extends StatefulWidget {
const CameraScreen({super.key});
@override @override
_CameraScreenState createState() => _CameraScreenState(); _CameraScreenState createState() => _CameraScreenState();
} }
+2 -2
View File
@@ -8,11 +8,11 @@ class CharacterView extends StatefulWidget {
final String content; final String content;
const CharacterView({ const CharacterView({
Key? key, super.key,
required this.title, required this.title,
required this.imagePath, required this.imagePath,
required this.content, required this.content,
}) : super(key: key); });
@override @override
_CharacterViewState createState() => _CharacterViewState(); _CharacterViewState createState() => _CharacterViewState();
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
class CollectionCaraterScreen extends StatefulWidget { class CollectionCaraterScreen extends StatefulWidget {
const CollectionCaraterScreen({super.key}); const CollectionCaraterScreen({super.key});
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
import 'package:furibase/helpers/color_helper.dart'; import 'package:freekake/helpers/color_helper.dart';
class CollectionFragmentScreen extends StatefulWidget { class CollectionFragmentScreen extends StatefulWidget {
const CollectionFragmentScreen({super.key}); const CollectionFragmentScreen({super.key});
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
class CollectionSkinScreen extends StatefulWidget { class CollectionSkinScreen extends StatefulWidget {
const CollectionSkinScreen({super.key}); const CollectionSkinScreen({super.key});
@@ -11,7 +11,7 @@ class CollectionSkinScreen extends StatefulWidget {
class _CollectionSkinScreenState extends State<CollectionSkinScreen> { class _CollectionSkinScreenState extends State<CollectionSkinScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return SizedBox(
// scrollDirection: Axis.horizontal, // scrollDirection: Axis.horizontal,
height: MediaQuery.of(context).size.height, height: MediaQuery.of(context).size.height,
child: Column( child: Column(
+1 -1
View File
@@ -1,5 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/navbar_container.dart'; import 'package:freekake/components/navbar_container.dart';
class DrawScreen extends StatelessWidget { class DrawScreen extends StatelessWidget {
const DrawScreen({super.key}); const DrawScreen({super.key});
+127 -119
View File
@@ -1,14 +1,14 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/bottom_navbar.dart'; import 'package:freekake/components/bottom_navbar.dart';
import 'package:furibase/components/buildcard_info.dart'; import 'package:freekake/components/buildcard_info.dart';
import 'package:furibase/components/curve_bottom_border_tab.dart'; import 'package:freekake/components/curve_bottom_border_tab.dart';
import 'package:furibase/components/main_menu.dart'; import 'package:freekake/components/main_menu.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:furibase/components/tab_menu.dart'; import 'package:freekake/components/tab_menu.dart';
import 'package:furibase/components/topbar_container.dart'; import 'package:freekake/components/topbar_container.dart';
import 'package:furibase/screen/collection/collection_caracter_screen.dart'; import 'package:freekake/screen/collection/collection_caracter_screen.dart';
import 'package:furibase/screen/collection/collection_fragment_screen.dart'; import 'package:freekake/screen/collection/collection_fragment_screen.dart';
import 'package:furibase/screen/collection/collection_skin_screen.dart'; import 'package:freekake/screen/collection/collection_skin_screen.dart';
class KoleksiScreen extends StatefulWidget { class KoleksiScreen extends StatefulWidget {
const KoleksiScreen({super.key}); const KoleksiScreen({super.key});
@@ -41,127 +41,135 @@ class _KoleksiScreenState extends State<KoleksiScreen> {
final double bottomPadding = (9000 / screenWidth).clamp(0, 0.2); final double bottomPadding = (9000 / screenWidth).clamp(0, 0.2);
return Scaffold( return Scaffold(
extendBody: true, extendBody: true,
body: Stack( body: koleksiBody(bottomPadding, screenWidth, buttonScanSize),
children: <Widget>[ );
Positioned.fill( }
child: Container(color: const Color.fromARGB(255, 255, 255, 255)),
), Stack koleksiBody(
Positioned.fill( double bottomPadding,
top: 30, double screenWidth,
child: PageView( double buttonScanSize,
controller: _pageController, ) {
onPageChanged: (index) { return Stack(
setState(() { children: <Widget>[
_selectedIndex = index; Positioned.fill(
}); child: Container(color: const Color.fromARGB(255, 255, 255, 255)),
}, ),
children: [ Positioned.fill(
const CollectionCaraterScreen(), top: 30,
const CollectionSkinScreen(), child: PageView(
const CollectionFragmentScreen(), controller: _pageController,
], onPageChanged: (index) {
), setState(() {
), _selectedIndex = index;
// BG MEnu });
Stack( },
children: [ children: [
Positioned( const CollectionCaraterScreen(),
bottom: 0, const CollectionSkinScreen(),
left: 0, const CollectionFragmentScreen(),
right: 0, ],
child: SizedBox(height: 85, child: BottomNavbar()), ),
),
// BG MEnu
Stack(
children: [
Positioned(
bottom: 0,
left: 0,
right: 0,
child: SizedBox(height: 85, child: BottomNavbar()),
),
],
),
//TopBar
Positioned(
top: 0,
left: 0,
right: 0,
child: SizedBox(height: 130, child: TopbarContainer()),
),
Positioned(
top: 10,
left: 10,
right: 10,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BuildcardInfo(
icon: Icons.person,
text: 'User01',
extraIcon: Icons.emoji_events,
extraText: "5000",
width: 180,
),
BuildcardInfo(
icon: Icons.monetization_on,
text: "1.300",
width: 90,
), ),
], ],
), ),
//TopBar ),
Positioned( // Positioned.fill(
top: 0, // top: 30,
left: 0, // child: PageView(
right: 0, // controller: _pageController,
child: SizedBox(height: 130, child: TopbarContainer()), // onPageChanged: (index) {
), // setState(() {
// _selectedIndex = index;
Positioned( // });
top: 10, // },
left: 10, // children: [
right: 10, // const CollectionCaraterScreen(),
// const CollectionSkinScreen(),
// const CollectionFragmentScreen(),
// ],
// ),
// ),
Positioned(
top: 70,
left: 10,
right: 10,
child: Container(
// decoration: const BoxDecoration(
// borderRadius: BorderRadius.all(Radius.circular(20)),
// color: Color.fromARGB(116, 125, 129, 133),
// ),
padding: const EdgeInsets.all(1),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [ children: [
BuildcardInfo( CurvedBottomBorderTab(
icon: Icons.person, label: "Karakter",
text: 'User01', isSelected: _selectedIndex == 0,
extraIcon: Icons.emoji_events, tap: () => _onMenuTapped(0),
extraText: "5000",
width: 180,
), ),
BuildcardInfo( CurvedBottomBorderTab(
icon: Icons.monetization_on, label: "Skin",
text: "1.300", isSelected: _selectedIndex == 1,
width: 90, tap: () => _onMenuTapped(1),
),
CurvedBottomBorderTab(
label: "Fragment",
isSelected: _selectedIndex == 2,
tap: () => _onMenuTapped(2),
), ),
], ],
), ),
), ),
// Positioned.fill( ),
// top: 30, Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()),
// child: PageView( Positioned(
// controller: _pageController, bottom: bottomPadding * 98,
// onPageChanged: (index) { left: (screenWidth - buttonScanSize) / 2,
// setState(() { child: Transform.translate(
// _selectedIndex = index; offset: Offset(0, -20),
// }); child: ScanButton(),
// },
// children: [
// const CollectionCaraterScreen(),
// const CollectionSkinScreen(),
// const CollectionFragmentScreen(),
// ],
// ),
// ),
Positioned(
top: 70,
left: 10,
right: 10,
child: Container(
// decoration: const BoxDecoration(
// borderRadius: BorderRadius.all(Radius.circular(20)),
// color: Color.fromARGB(116, 125, 129, 133),
// ),
padding: const EdgeInsets.all(1),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
CurvedBottomBorderTab(
label: "Karakter",
isSelected: _selectedIndex == 0,
tap: () => _onMenuTapped(0),
),
CurvedBottomBorderTab(
label: "Skin",
isSelected: _selectedIndex == 1,
tap: () => _onMenuTapped(1),
),
CurvedBottomBorderTab(
label: "Fragment",
isSelected: _selectedIndex == 2,
tap: () => _onMenuTapped(2),
),
],
),
),
), ),
Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()), ),
Positioned( ],
bottom: bottomPadding * 98,
left: (screenWidth - buttonScanSize) / 2,
child: Transform.translate(
offset: Offset(0, -20),
child: ScanButton(),
),
),
],
),
); );
} }
} }
+204 -219
View File
@@ -3,14 +3,14 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:furibase/components/card_list.dart'; import 'package:freekake/components/card_list.dart';
import 'package:furibase/components/collection_container%20copy.dart'; import 'package:freekake/components/collection_container%20copy.dart';
// import 'package:furibase/components/main_menu.dart'; // import 'package:freekake/components/main_menu.dart';
// import 'package:furibase/components/topbar_container.dart'; // import 'package:freekake/components/topbar_container.dart';
import 'package:furibase/helpers/color_helper.dart'; import 'package:freekake/helpers/color_helper.dart';
import 'package:list_detail_extension/list_detail_extension.dart'; import 'package:list_detail_extension/list_detail_extension.dart';
// import 'package:furibase/screen/pustaka/pustaka_detail_screen.dart'; // import 'package:freekake/screen/pustaka/pustaka_detail_screen.dart';
import 'package:webview_flutter/webview_flutter.dart'; import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/foundation.dart' show kIsWeb;
@@ -85,7 +85,7 @@ class _ListEducationState extends State<ListEducation> {
} }
void _loadContent(String path) async { void _loadContent(String path) async {
if (_shouldShowWebView && _controller != null) { if (_shouldShowWebView) {
if (path.startsWith('http')) { if (path.startsWith('http')) {
// Load dari Internet // Load dari Internet
_controller.loadRequest(Uri.parse(path)); _controller.loadRequest(Uri.parse(path));
@@ -124,8 +124,8 @@ class _ListEducationState extends State<ListEducation> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
String _searchQuery = ""; String searchQuery = "";
final List<Map<String, dynamic>> _collections = [ final List<Map<String, dynamic>> collections = [
{ {
"label": "Kesehatan", "label": "Kesehatan",
"image": "assets/icons/healthy.svg", "image": "assets/icons/healthy.svg",
@@ -153,14 +153,14 @@ class _ListEducationState extends State<ListEducation> {
]; ];
final List<Map<String, dynamic>> filteredCollections = final List<Map<String, dynamic>> filteredCollections =
_collections collections
.where( .where(
(item) => item["label"].toLowerCase().contains( (item) => item["label"].toLowerCase().contains(
_searchQuery.toLowerCase(), searchQuery.toLowerCase(),
), ),
) )
.toList(); .toList();
if (_shouldShowWebView && _controller != null) { if (_shouldShowWebView) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
backgroundColor: Color.fromARGB(225, 79, 76, 182), backgroundColor: Color.fromARGB(225, 79, 76, 182),
@@ -174,215 +174,10 @@ class _ListEducationState extends State<ListEducation> {
body: Column( body: Column(
children: [ children: [
// Header Section // Header Section
Container( headerContainer(context, filteredCollections),
width: MediaQuery.of(context).size.width,
height: 150,
decoration: BoxDecoration(
color: const Color.fromARGB(225, 79, 76, 182),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(25),
bottomRight: Radius.circular(25),
),
),
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 20,
vertical: 6,
),
child: Container(
height: 47,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: Colors.grey.shade200,
),
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
children: [
const Icon(
Icons.search,
color: Color.fromARGB(137, 180, 172, 172),
size: 18,
),
const SizedBox(width: 8),
Expanded(
child: TextField(
controller: searchController,
onChanged:
filterSearch, // Memanggil filter saat mengetik
style: const TextStyle(
color: Colors.black,
fontSize: 14,
),
decoration: const InputDecoration(
border: InputBorder.none,
hintText: 'Cari pelajaran...',
hintStyle: TextStyle(color: Colors.black54),
),
),
),
if (searchController.text.isNotEmpty)
IconButton(
icon: const Icon(
Icons.close,
color: Colors.black54,
),
onPressed: () {
searchController.clear();
filterSearch('');
},
),
],
),
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children:
filteredCollections.map((item) {
return CollectionContainer(
label: item["label"]!,
imageSvg: item["image"]!,
iconw: 20,
iconh: 20,
width: 70,
height: 70,
textColor: Colors.black,
lblSize: 10,
colorContiner: ColorHelper.hexToColor(
item["color"],
),
onTapAc:
() => {
searchController.clear(),
filterByCategory(item["category"]),
},
);
}).toList(),
),
],
),
),
// Collection Items dengan Filter // Collection Items dengan Filter
SizedBox(height: 20), SizedBox(height: 20),
Expanded( Expanded(child: contentContainer(context)),
child: Container(
decoration: BoxDecoration(
color: const Color.fromARGB(223, 200, 200, 206),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(25),
topRight: Radius.circular(25),
),
),
child: Column(
children: [
SizedBox(height: 5),
Padding(
padding: EdgeInsets.symmetric(
horizontal: MediaQuery.of(context).size.width / 4,
),
child: Divider(
color: const Color.fromARGB(255, 255, 255, 255),
thickness: 2,
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10,
// vertical: 10,
),
child:
filteredItems.isEmpty
? const Center(
child: Text(
"Tidak ada hasil",
style: TextStyle(
fontSize: 16,
color: Colors.black54,
),
),
)
: Padding(
padding: EdgeInsets.only(
top: 10.0,
left: 10,
right: 10,
),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
color: const Color.fromARGB(
255,
222,
181,
133,
),
),
child: Padding(
padding: EdgeInsets.only(
top: 12,
right: 20,
left: 20,
),
child: GridView.builder(
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1, // 2 Kolom
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 2.5,
),
itemCount: _listContent.length,
itemBuilder: (context, index) {
return GestureDetector(
child: CardList(
title:
_listContent[index]["title"] ??
"",
body:
_listContent[index]["body"] ??
"",
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder:
(
context,
) => listDetailExtension.buildPage({
'title':
filteredItems[index]['category'],
'imagePath':
filteredItems[index]['image'],
'filepath':
filteredItems[index]['file'],
'paragraphs':
"""
""" +
"<h1> ${_listContent[index]["title"]} </h1> <p> ${_listContent[index]["body"]}",
}),
),
);
},
);
},
),
),
),
),
),
),
],
),
),
),
], ],
), ),
); );
@@ -395,4 +190,194 @@ class _ListEducationState extends State<ListEducation> {
); );
} }
} }
Container headerContainer(
BuildContext context,
List<Map<String, dynamic>> filteredCollections,
) {
return Container(
width: MediaQuery.of(context).size.width,
height: 150,
decoration: BoxDecoration(
color: const Color.fromARGB(225, 79, 76, 182),
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(25),
bottomRight: Radius.circular(25),
),
),
child: Column(
children: [
Padding(
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 6),
child: Container(
height: 47,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: Colors.grey.shade200,
),
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Row(
children: [
const Icon(
Icons.search,
color: Color.fromARGB(137, 180, 172, 172),
size: 18,
),
const SizedBox(width: 8),
Expanded(
child: TextField(
controller: searchController,
onChanged: filterSearch, // Memanggil filter saat mengetik
style: const TextStyle(color: Colors.black, fontSize: 14),
decoration: const InputDecoration(
border: InputBorder.none,
hintText: 'Cari pelajaran...',
hintStyle: TextStyle(color: Colors.black54),
),
),
),
if (searchController.text.isNotEmpty)
IconButton(
icon: const Icon(Icons.close, color: Colors.black54),
onPressed: () {
searchController.clear();
filterSearch('');
},
),
],
),
),
),
Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children:
filteredCollections.map((item) {
return CollectionContainer(
label: item["label"]!,
imageSvg: item["image"]!,
iconw: 20,
iconh: 20,
width: 70,
height: 70,
textColor: Colors.black,
lblSize: 10,
colorContiner: ColorHelper.hexToColor(item["color"]),
onTapAc:
() => {
searchController.clear(),
filterByCategory(item["category"]),
},
);
}).toList(),
),
],
),
);
}
Container contentContainer(BuildContext context) {
return Container(
decoration: BoxDecoration(
color: const Color.fromARGB(223, 200, 200, 206),
borderRadius: BorderRadius.only(
topLeft: Radius.circular(25),
topRight: Radius.circular(25),
),
),
child: Column(
children: [
SizedBox(height: 5),
Padding(
padding: EdgeInsets.symmetric(
horizontal: MediaQuery.of(context).size.width / 4,
),
child: Divider(
color: const Color.fromARGB(255, 255, 255, 255),
thickness: 2,
),
),
Expanded(
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 10,
// vertical: 10,
),
child:
filteredItems.isEmpty
? const Center(
child: Text(
"Tidak ada hasil",
style: TextStyle(fontSize: 16, color: Colors.black54),
),
)
: Padding(
padding: EdgeInsets.only(
top: 10.0,
left: 10,
right: 10,
),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20),
topRight: Radius.circular(20),
),
color: const Color.fromARGB(255, 222, 181, 133),
),
child: Padding(
padding: EdgeInsets.only(
top: 12,
right: 20,
left: 20,
),
child: GridView.builder(
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 1, // 2 Kolom
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 2.5,
),
itemCount: _listContent.length,
itemBuilder: (context, index) {
return GestureDetector(
child: CardList(
title: _listContent[index]["title"] ?? "",
body: _listContent[index]["body"] ?? "",
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder:
(
context,
) => listDetailExtension.buildPage({
'title':
filteredItems[index]['category'],
'imagePath':
filteredItems[index]['image'],
'filepath':
filteredItems[index]['file'],
'paragraphs':
"""
"""
"<h1> ${_listContent[index]["title"]} </h1> <p> ${_listContent[index]["body"]}",
}),
),
);
},
);
},
),
),
),
),
),
),
],
),
);
}
} }
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/buildcard_info.dart'; import 'package:freekake/components/buildcard_info.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
class DetailScreen extends StatefulWidget { class DetailScreen extends StatefulWidget {
final String title; final String title;
+141 -111
View File
@@ -9,12 +9,12 @@ class ListDetailScreen extends StatefulWidget {
final String filepath; final String filepath;
const ListDetailScreen({ const ListDetailScreen({
Key? key, super.key,
required this.title, required this.title,
required this.imagePath, required this.imagePath,
required this.paragraphs, required this.paragraphs,
required this.filepath, required this.filepath,
}) : super(key: key); });
@override @override
_ListDetailScreenState createState() => _ListDetailScreenState(); _ListDetailScreenState createState() => _ListDetailScreenState();
@@ -41,6 +41,11 @@ class _ListDetailScreenState extends State<ListDetailScreen> {
String html = await DefaultAssetBundle.of( String html = await DefaultAssetBundle.of(
context, context,
).loadString(widget.filepath); ).loadString(widget.filepath);
html = html.replaceAllMapped(
RegExp(r'<div class="gizi-grid">(.*?)</div>', dotAll: true),
(match) => '<gizi-grid>${match.group(1)}</gizi-grid>',
);
setState(() { setState(() {
_htmlContent = html; _htmlContent = html;
}); });
@@ -102,115 +107,73 @@ class _ListDetailScreenState extends State<ListDetailScreen> {
child: SingleChildScrollView( child: SingleChildScrollView(
padding: const EdgeInsets.only(left: 18.0, right: 18, bottom: 18), padding: const EdgeInsets.only(left: 18.0, right: 18, bottom: 18),
child: child:
// ListView.builder( // ListView.builder(
// itemCount: widget.paragraphs.length, // itemCount: widget.paragraphs.length,
// itemBuilder: (context, index) { // itemBuilder: (context, index) {
// return // return
// Padding( // Padding(
// padding: const EdgeInsets.only(bottom: 16.0), // padding: const EdgeInsets.only(bottom: 16.0),
// child: Row( // child: Row(
// crossAxisAlignment: CrossAxisAlignment.start, // crossAxisAlignment: CrossAxisAlignment.start,
// children: [ // children: [
// Expanded( // Expanded(
// child: // child:
// // Text( // // Text(
// // widget.paragraphs[index] + // // widget.paragraphs[index] +
// // style: TextStyle(color: Colors.black), // // style: TextStyle(color: Colors.black),
// Html( // Html(
// // style: { // // style: {
// // "body": Style( // // "body": Style(
// // color: const Color.fromRGBO(0, 0, 0, 1), // // color: const Color.fromRGBO(0, 0, 0, 1),
// // ), // // ),
// // }, // // },
// data: // data:
// widget.paragraphs + // widget.paragraphs +
// """ // """
// <html> // <html>
// <!-- Text between angle brackets is an HTML tag and is not displayed. // <!-- Text between angle brackets is an HTML tag and is not displayed.
// Most tags, such as the HTML and /HTML tags that surround the contents of // Most tags, such as the HTML and /HTML tags that surround the contents of
// a page, come in pairs; some tags, like HR, for a horizontal rule, stand // a page, come in pairs; some tags, like HR, for a horizontal rule, stand
// alone. Comments, such as the text you're reading, are not displayed when // alone. Comments, such as the text you're reading, are not displayed when
// the Web page is shown. The information between the HEAD and /HEAD tags is // the Web page is shown. The information between the HEAD and /HEAD tags is
// not displayed. The information between the BODY and /BODY tags is displayed.--> // not displayed. The information between the BODY and /BODY tags is displayed.-->
// <head> // <head>
// <title>Enter a title, displayed at the top of the window.</title> // <title>Enter a title, displayed at the top of the window.</title>
// </head> // </head>
// <!-- The information between the BODY and /BODY tags is displayed.--> // <!-- The information between the BODY and /BODY tags is displayed.-->
// <body> // <body>
// <h1>Enter the main heading, usually the same as the title.</h1> // <h1>Enter the main heading, usually the same as the title.</h1>
// <p>Be <b>bold</b> in stating your key points. Put them in a list: </p> // <p>Be <b>bold</b> in stating your key points. Put them in a list: </p>
// <ul> // <ul>
// <li>The first item in your list</li> // <li>The first item in your list</li>
// <li>The second item; <i>italicize</i> key words</li> // <li>The second item; <i>italicize</i> key words</li>
// </ul> // </ul>
// <p>Improve your image by including an image. </p> // <p>Improve your image by including an image. </p>
// <p><img src="http://www.mygifs.com/CoverImage.gif" alt="A Great HTML Resource"></p> // <p><img src="http://www.mygifs.com/CoverImage.gif" alt="A Great HTML Resource"></p>
// <p>Add a link to your favorite <a href="https://www.dummies.com/">Web site</a>. // <p>Add a link to your favorite <a href="https://www.dummies.com/">Web site</a>.
// Break up your page with a horizontal rule or two. </p> // Break up your page with a horizontal rule or two. </p>
// <hr> // <hr>
// <p>Finally, link to <a href="page2.html">another page</a> in your own Web site.</p> // <p>Finally, link to <a href="page2.html">another page</a> in your own Web site.</p>
// <!-- And add a copyright notice.--> // <!-- And add a copyright notice.-->
// <p>© Wiley Publishing, 2011</p> // <p>© Wiley Publishing, 2011</p>
// </body> // </body>
// </html> // </html>
// """, // """,
// ), // ),
// ), // ),
// // ), // // ),
// // Checkbox( // // Checkbox(
// // value: _readStatus[index], // // value: _readStatus[index],
// // onChanged: (bool? value) { // // onChanged: (bool? value) {
// // _toggleReadStatus(index); // // _toggleReadStatus(index);
// // }, // // },
// // ), // // ),
// ], // ],
// ), // ),
// ); // );
// }, // },
// ), // ),
Html( htmlBody(),
style: {"body": Style(color: const Color.fromRGBO(0, 0, 0, 1))},
// data: widget.paragraphs,
data: _htmlContent,
extensions: [
TagExtension(
tagsToExtend: {"img"},
builder: (ExtensionContext context) {
final attrs = context.attributes;
final src = attrs['src'] ?? '';
if (src.isNotEmpty) {
if (src.startsWith('assets/html/')) {
return Image.asset(
src,
width: 100,
errorBuilder:
(context, error, stackTrace) =>
const Text('Image not found'),
);
} else if (!src.startsWith('http')) {
return Image.asset(
'assets/images/$src',
width: 100,
errorBuilder:
(context, error, stackTrace) =>
const Text('Image not found'),
);
} else {
return Image.network(
src,
width: 100,
errorBuilder:
(context, error, stackTrace) =>
const Text('Image failed to load'),
);
}
}
return const SizedBox();
},
),
],
),
), ),
), ),
], ],
@@ -218,4 +181,71 @@ class _ListDetailScreenState extends State<ListDetailScreen> {
// ), // ),
); );
} }
Html htmlBody() {
return Html(
style: {"body": Style(color: const Color.fromRGBO(0, 0, 0, 1))},
// data: widget.paragraphs,
data: _htmlContent,
extensions: [
TagExtension(
tagsToExtend: {"img"},
builder: (ExtensionContext context) {
final attrs = context.attributes;
final src = attrs['src'] ?? '';
if (src.isNotEmpty) {
if (src.startsWith('assets/html/')) {
return Image.asset(
src,
width: 100,
errorBuilder:
(context, error, stackTrace) =>
const Text('Image not found'),
);
} else if (!src.startsWith('http')) {
return Image.asset(
'assets/images/$src',
width: 100,
errorBuilder:
(context, error, stackTrace) =>
const Text('Image not found'),
);
} else {
return Image.network(
src,
width: 100,
errorBuilder:
(context, error, stackTrace) =>
const Text('Image failed to load'),
);
}
}
return const SizedBox();
},
),
TagExtension(
tagsToExtend: {"gizi-grid"},
builder: (context) {
final spans = context.inlineSpanChildren ?? [];
final widgets =
spans.map((span) {
if (span is WidgetSpan) return span.child;
return const SizedBox();
}).toList();
return Wrap(
spacing: 12,
runSpacing: 12,
children:
widgets.map((child) {
return SizedBox(width: 160, child: child);
}).toList(),
);
},
),
],
);
}
} }
+6 -6
View File
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/buildcard_info.dart'; import 'package:freekake/components/buildcard_info.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
import 'package:furibase/components/menu_button.dart'; import 'package:freekake/components/menu_button.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:furibase/screen/Home_screen.dart'; import 'package:freekake/screen/Home_screen.dart';
import 'package:furibase/screen/pustaka/list_education.dart'; import 'package:freekake/screen/pustaka/list_education.dart';
class PustakaScreen extends StatefulWidget { class PustakaScreen extends StatefulWidget {
const PustakaScreen({super.key}); const PustakaScreen({super.key});
+6 -6
View File
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/buildcard_info.dart'; import 'package:freekake/components/buildcard_info.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
import 'package:furibase/components/menu_button.dart'; import 'package:freekake/components/menu_button.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:furibase/screen/Home_screen.dart'; import 'package:freekake/screen/Home_screen.dart';
import 'package:furibase/screen/pustaka/list_education.dart'; import 'package:freekake/screen/pustaka/list_education.dart';
class PustakaScreen extends StatefulWidget { class PustakaScreen extends StatefulWidget {
const PustakaScreen({super.key}); const PustakaScreen({super.key});
+6 -6
View File
@@ -1,10 +1,10 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/buildcard_info.dart'; import 'package:freekake/components/buildcard_info.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
import 'package:furibase/components/menu_button.dart'; import 'package:freekake/components/menu_button.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:furibase/screen/Home_screen.dart'; import 'package:freekake/screen/Home_screen.dart';
import 'package:furibase/screen/pustaka/list_education.dart'; import 'package:freekake/screen/pustaka/list_education.dart';
class PustakaScreen extends StatefulWidget { class PustakaScreen extends StatefulWidget {
const PustakaScreen({super.key}); const PustakaScreen({super.key});
+222 -215
View File
@@ -1,12 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/bottom_navbar.dart'; import 'package:freekake/components/bottom_navbar.dart';
import 'package:furibase/components/buildcard_info.dart'; import 'package:freekake/components/buildcard_info.dart';
import 'package:furibase/components/collection_container.dart'; import 'package:freekake/components/collection_container.dart';
import 'package:furibase/components/main_menu.dart'; import 'package:freekake/components/main_menu.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:furibase/components/topbar_container.dart'; import 'package:freekake/components/topbar_container.dart';
import 'package:furibase/helpers/color_helper.dart'; import 'package:freekake/helpers/color_helper.dart';
import 'package:furibase/screen/pustaka/list_education.dart'; import 'package:freekake/screen/pustaka/list_education.dart';
class PustakaScreen extends StatefulWidget { class PustakaScreen extends StatefulWidget {
const PustakaScreen({super.key}); const PustakaScreen({super.key});
@@ -71,202 +71,209 @@ class _PustakaScreenState extends State<PustakaScreen> {
return Scaffold( return Scaffold(
backgroundColor: const Color.fromARGB(255, 255, 255, 255), backgroundColor: const Color.fromARGB(255, 255, 255, 255),
body: Stack( body: pustakaBody(
children: [ filteredCollections,
//Top Bar context,
Positioned( bottomPadding,
top: 0, screenWidth,
left: 0, buttonScanSize,
right: 0, ),
child: SizedBox(height: 130, child: TopbarContainer()), );
), }
Column(
children: [ Stack pustakaBody(
// Header Section List<Map<String, dynamic>> filteredCollections,
Container( BuildContext context,
padding: const EdgeInsets.all(10), double bottomPadding,
color: const Color.fromARGB( double screenWidth,
250, double buttonScanSize,
255, ) {
255, return Stack(
255, children: [
).withOpacity(0.0), //Top Bar
Positioned(
top: 0,
left: 0,
right: 0,
child: SizedBox(height: 130, child: TopbarContainer()),
),
Column(
children: [
// Header Section
Container(
padding: const EdgeInsets.all(10),
color: const Color.fromARGB(250, 255, 255, 255).withOpacity(0.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
BuildcardInfo(
icon: Icons.person,
text: 'User01',
extraIcon: Icons.emoji_events,
extraText: "5000",
width: 180,
),
BuildcardInfo(
icon: Icons.monetization_on,
text: "1.300",
width: 90,
),
],
),
),
// // Date Display
// Padding(
// padding: const EdgeInsets.symmetric(vertical: 10),
// child: Text(
// DateTime.now().toString(),
// style: const TextStyle(color: Colors.white),
// ),
// ),
// Search Bar
Padding(
padding: const EdgeInsets.symmetric(horizontal: 40, vertical: 10),
child: Container(
height: 47,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
color: const Color.fromARGB(255, 237, 227, 227),
),
padding: const EdgeInsets.symmetric(horizontal: 15),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
BuildcardInfo( const Icon(Icons.search, color: Colors.black54, size: 18),
icon: Icons.person, const SizedBox(width: 8),
text: 'User01', Expanded(
extraIcon: Icons.emoji_events, child: TextField(
extraText: "5000", controller: _searchController,
width: 180, onChanged: (value) {
), setState(() {
BuildcardInfo( _searchQuery = value;
icon: Icons.monetization_on, });
text: "1.300", },
width: 90, style: const TextStyle(
color: Colors.black,
fontSize: 12,
),
decoration: const InputDecoration(
border: InputBorder.none,
hintText: 'Search...',
hintStyle: TextStyle(color: Colors.grey),
),
),
), ),
], ],
), ),
), ),
),
// // Date Display // Collection Items
// Padding( SizedBox(
// padding: const EdgeInsets.symmetric(vertical: 10), height: 440,
// child: Text( child: Padding(
// DateTime.now().toString(),
// style: const TextStyle(color: Colors.white),
// ),
// ),
// Search Bar
Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 40, horizontal: 58,
vertical: 10, vertical: 60,
), ),
child: Container( child: GridView.builder(
height: 47, gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
decoration: BoxDecoration( maxCrossAxisExtent: 140,
borderRadius: BorderRadius.circular(20), mainAxisSpacing: 20,
color: const Color.fromARGB(255, 237, 227, 227), crossAxisSpacing: 20,
childAspectRatio: 1, // 1:1 rasio (kotak)
), ),
padding: const EdgeInsets.symmetric(horizontal: 15), itemCount: filteredCollections.length,
itemBuilder: (context, index) {
final item = filteredCollections[index];
return CollectionContainer(
label: item["label"]!,
imageSvg: item["image"]!,
width: 30,
height: 80,
textColor: Colors.black,
circle: true,
colorContiner: ColorHelper.hexToColor(item["color"]),
onTapAc: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const ListEducation(),
),
);
},
);
},
),
),
),
// SizedBox(
// child: Padding(
// padding: const EdgeInsets.symmetric(
// horizontal: 5,
// vertical: 1,
// ),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Text("List Topic", style: TextStyle(color: Colors.black)),
// Divider(color: Colors.transparent),
// ],
// ),
// ),
// ),
// Horizontal Scroll List
Padding(
padding: EdgeInsets.symmetric(horizontal: 5, vertical: 5),
child: SizedBox(
width: MediaQuery.of(context).size.width,
height: 100,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row( child: Row(
children: [ children: List.generate(
const Icon(Icons.search, color: Colors.black54, size: 18), 10,
const SizedBox(width: 8), (index) => Padding(
Expanded( padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: TextField( child: Card(
controller: _searchController, shape: RoundedRectangleBorder(
onChanged: (value) { borderRadius: BorderRadius.circular(10.0),
setState(() {
_searchQuery = value;
});
},
style: const TextStyle(
color: Colors.black,
fontSize: 12,
), ),
decoration: const InputDecoration( elevation: 5,
border: InputBorder.none, color: ColorHelper.hexToColor("#efd8c6"),
hintText: 'Search...', // color: const Color.fromARGB(140, 255, 255, 255),
hintStyle: TextStyle(color: Colors.grey), // shape: RoundedRectangleBorder(
), // borderRadius: BorderRadius.circular(15),
), // ),
), child: GestureDetector(
], onTap:
), () => {
), Navigator.push(
), context,
// Collection Items MaterialPageRoute(
Container( builder: (context) => ListEducation(),
height: 440,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 58,
vertical: 60,
),
child: GridView.builder(
gridDelegate:
const SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 140,
mainAxisSpacing: 20,
crossAxisSpacing: 20,
childAspectRatio: 1, // 1:1 rasio (kotak)
),
itemCount: filteredCollections.length,
itemBuilder: (context, index) {
final item = filteredCollections[index];
return CollectionContainer(
label: item["label"]!,
imageSvg: item["image"]!,
width: 30,
height: 80,
textColor: Colors.black,
circle: true,
colorContiner: ColorHelper.hexToColor(item["color"]),
onTapAc: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const ListEducation(),
),
);
},
);
},
),
),
),
// SizedBox(
// child: Padding(
// padding: const EdgeInsets.symmetric(
// horizontal: 5,
// vertical: 1,
// ),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.start,
// children: [
// Text("List Topic", style: TextStyle(color: Colors.black)),
// Divider(color: Colors.transparent),
// ],
// ),
// ),
// ),
// Horizontal Scroll List
Padding(
padding: EdgeInsets.symmetric(horizontal: 5, vertical: 5),
child: SizedBox(
width: MediaQuery.of(context).size.width,
height: 100,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: List.generate(
10,
(index) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
elevation: 5,
color: ColorHelper.hexToColor("#efd8c6"),
// color: const Color.fromARGB(140, 255, 255, 255),
// shape: RoundedRectangleBorder(
// borderRadius: BorderRadius.circular(15),
// ),
child: GestureDetector(
onTap:
() => {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ListEducation(),
),
), ),
}, ),
child: Container( },
width: 80, child: Container(
padding: const EdgeInsets.all(10), width: 80,
child: Column( padding: const EdgeInsets.all(10),
mainAxisAlignment: MainAxisAlignment.center, child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.center,
Icon( children: [
Icons.book, Icon(
size: 50, Icons.book,
color: Colors.blueAccent, size: 50,
color: Colors.blueAccent,
),
Text(
'Topic ${index + 1}',
style: const TextStyle(
fontWeight: FontWeight.bold,
color: Color.fromARGB(255, 0, 0, 0),
), ),
Text( ),
'Topic ' + (index + 1).toString(), ],
style: const TextStyle(
fontWeight: FontWeight.bold,
color: Color.fromARGB(255, 0, 0, 0),
),
),
],
),
), ),
), ),
), ),
@@ -276,32 +283,32 @@ class _PustakaScreenState extends State<PustakaScreen> {
), ),
), ),
), ),
// Bottom Navigation
// MainMenu(),
],
),
// BG MEnu
Stack(
children: [
Positioned(
bottom: 0,
left: 0,
right: 0,
child: SizedBox(height: 85, child: BottomNavbar()),
),
Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()),
],
),
Positioned(
bottom: bottomPadding * 98,
left: (screenWidth - buttonScanSize) / 2,
child: Transform.translate(
offset: Offset(0, -20),
child: ScanButton(),
), ),
// Bottom Navigation
// MainMenu(),
],
),
// BG MEnu
Stack(
children: [
Positioned(
bottom: 0,
left: 0,
right: 0,
child: SizedBox(height: 85, child: BottomNavbar()),
),
Positioned(bottom: 0, left: 0, right: 0, child: MainMenu()),
],
),
Positioned(
bottom: bottomPadding * 98,
left: (screenWidth - buttonScanSize) / 2,
child: Transform.translate(
offset: Offset(0, -20),
child: ScanButton(),
), ),
], ),
), ],
); );
} }
} }
+5 -3
View File
@@ -1,9 +1,9 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:furibase/components/bottom_navbar.dart'; import 'package:freekake/components/bottom_navbar.dart';
import 'package:furibase/components/main_menu.dart'; import 'package:freekake/components/main_menu.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'dart:io'; import 'dart:io';
@@ -11,6 +11,8 @@ import 'dart:io';
import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/foundation.dart' show kIsWeb;
class AkunSaya extends StatefulWidget { class AkunSaya extends StatefulWidget {
const AkunSaya({super.key});
@override @override
_AkunSayaState createState() => _AkunSayaState(); _AkunSayaState createState() => _AkunSayaState();
} }
+6 -4
View File
@@ -2,10 +2,10 @@ import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_html/flutter_html.dart'; import 'package:flutter_html/flutter_html.dart';
import 'package:furibase/components/bottom_navbar.dart'; import 'package:freekake/components/bottom_navbar.dart';
import 'package:furibase/components/main_menu.dart'; import 'package:freekake/components/main_menu.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:furibase/screen/saya/akun_saya.dart'; import 'package:freekake/screen/saya/akun_saya.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'dart:io'; import 'dart:io';
@@ -13,6 +13,8 @@ import 'package:image_picker_web/image_picker_web.dart';
import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/foundation.dart' show kIsWeb;
class ProfileScreenCopy extends StatefulWidget { class ProfileScreenCopy extends StatefulWidget {
const ProfileScreenCopy({super.key});
@override @override
_ProfileScreenState createState() => _ProfileScreenState(); _ProfileScreenState createState() => _ProfileScreenState();
} }
+7 -5
View File
@@ -2,11 +2,11 @@ import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// import 'package:flutter_html/flutter_html.dart'; // import 'package:flutter_html/flutter_html.dart';
import 'package:furibase/components/bottom_navbar.dart'; import 'package:freekake/components/bottom_navbar.dart';
import 'package:furibase/components/main_menu.dart'; import 'package:freekake/components/main_menu.dart';
import 'package:furibase/components/scan_button.dart'; import 'package:freekake/components/scan_button.dart';
import 'package:furibase/components/topbar_container.dart'; import 'package:freekake/components/topbar_container.dart';
import 'package:furibase/screen/saya/akun_saya.dart'; import 'package:freekake/screen/saya/akun_saya.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'dart:io'; import 'dart:io';
@@ -14,6 +14,8 @@ import 'dart:io';
import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/foundation.dart' show kIsWeb;
class ProfileScreen extends StatefulWidget { class ProfileScreen extends StatefulWidget {
const ProfileScreen({super.key});
@override @override
_ProfileScreenState createState() => _ProfileScreenState(); _ProfileScreenState createState() => _ProfileScreenState();
} }
+1 -1
View File
@@ -1,4 +1,4 @@
name: furibase name: freekake
description: "A new Flutter project." description: "A new Flutter project."
# The following line prevents the package from being accidentally published to # The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.
+1 -1
View File
@@ -8,7 +8,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:furibase/main.dart'; import 'package:freekake/main.dart';
void main() { void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async { testWidgets('Counter increments smoke test', (WidgetTester tester) async {