
* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.
* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.
44번, 47번에 빨간 줄이 생겼는데 어떻게 처리해야 할 지 모르겠습니다.
에러 메세지는 _FeedState()가 Feed 클래스에 정의되지 않았다는 것 인데, StatefulWidget으로 여러 개 클래스를 생성해도 되나요?
제가 짠 코드에 대한 전반적인 이해가 필요한 상황입니다. 코딩 방향을 어떻게 잡아줘야 하는지 궁금합니다.
// import 'dart:html';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Element',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: HomePage(),
);
}
}
class Feed extends StatefulWidget {
const Feed({
Key?key,
required this.imageUrl, // Feed 위젯 호출시 전달 9번
required this.textContent,
required this.specContent,
required this.valueContent, // 글자를 담을 변수 ==*======
}) :super(key:key);
final String imageUrl; // )이미지를 담을 변수 전달 26번
final String textContent;
final String specContent; // 글자를 담을 변수 ==*======
final String valueContent;
@override
State<Feed> createState() => _FeedState(); // _HomePageState(); //
}
class _FeedState extends State<Feed> {
@Override
}
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return DefaultTabController(
initialIndex: 1,
length: 3,
child: Builder(builder: (context) {
DefaultTabController.of(context)?.addListener(() {
setState(() {});
});
return Scaffold(
body: Stack(
children: [
TabBarView(
children: [
FirstTab(),
SecondTab(),
ThirdTab(),
],
),
SafeArea(
child: Padding(
padding:
const EdgeInsets.symmetric(vertical: 20, horizontal: 16),
child: Column(
children: [
Container(
alignment: Alignment.topCenter,
child: TabPageSelector(
color: DefaultTabController.of(context)?.index == 1
? Colors.blue[300]
: Colors.grey[400],
selectedColor:
DefaultTabController.of(context)?.index == 1
? Colors.white
: Colors.blue,
indicatorSize: 8,
),
),
],
),
),
),
],
),
);
}),
);
}
}
// 첫번째 페이지
class FirstTab extends StatelessWidget {
const FirstTab({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final List<String> images = [
"https://www.laboratuar.com/images/rh-rodyum-cevher-mineral-analizi.jpg",
"https://www.mastah.org/wp-content/uploads/2017/11/Sesium-Cesium-Cs-Penjelasan-Sifat-dan-Kegunaan.jpg",
"https://cdn2.thecatapi.com/images/6bt.jpg",
"https://periodic-table.io/images/elements/Sc.jpg",
"https://i0.wp.com/periodic-table.com/wp-content/uploads/2019/01/Thulium.jpg?resize=248%2C203&ssl=1",
];
// ignore: unused_local_variable
final List<String> text1 = [
'Rh(로듐)', 'Cs(세슘)', 'Lu(루테늄)', 'Sc(스칸듐)', 'Tm(툴륨)'
];
final List<String> spectext1 = [
'분말 99.9% 1g', '금속(봉입) 1g', '작은 조각 99.9% 1g', 'ingot 99.9% 1g', '원형 작은 조각 1g'
];
final List<String> valuetext1 = [
'600,000원', '524,000원', '505,000원', '459,000원', '331,000원'
];
return Scaffold( // AppBar icons 입력
appBar:AppBar(
backgroundColor:Colors.white,// " 백그라운드
elevation:0.5,
leading:Row(
children: [
SizedBox(width:10),
Text(
'원소의 가격 순위',
style:TextStyle(
color:Colors.black,
fontWeight:FontWeight.bold,
fontSize:20,
),
),
Icon(
Icons.keyboard_arrow_down_rounded,
color:Colors.black,
),
],
),
leadingWidth:1, // overflowed시 좀 크게
actions: [
IconButton(
onPressed: () {},
icon:Icon(CupertinoIcons.search, color:Colors.black), // 문법err red~~에 mouse Quick Fix /ctrl ./import
),
IconButton(
onPressed: () {},
icon:Icon(Icons.menu_rounded, color:Colors.black),
),
IconButton(
onPressed: () {},
icon:Icon(CupertinoIcons.bell, color:Colors.black),
),
],
),
body:Padding( //ListView >Wrap with Padding으로
padding:const EdgeInsets.symmetric(horizontal:16), // padding: const Edge del> 코드스니펫.symmetric(hori~
child:ListView.separated( // ListView를 Refactor >Wrap with Padding
itemCount:images.length, // 이미지 개수만큼 보여주기**** itemCount: 10, >itemCount: images.length, <paste>
itemBuilder: (context,index) {
final image = images[index]; // index에 해당하는 이미지
final text2 = text1[index]; // index에 해당하는 text꾸러미
final spectext2 = spectext1[index];
final valuetext2 = valuetext1[index];
return Padding(
padding:const EdgeInsets.symmetric(vertical:12), //child: Feed(imageUrl: image), //imageUrl전달 child: Feed(), >
child: Feed(
imageUrl: image,
textContent: text2,
specContent: spectext2,
valueContent: valuetext2,
), // ==*==-----제목입력------
);
},
separatorBuilder: (context, index) {
return Divider();
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {},
backgroundColor: Color(0xFFFF7E36),
elevation: 1,
child: Icon(
Icons.add_rounded,
size: 36,
),
),
bottomNavigationBar: BottomNavigationBar(
fixedColor: Colors.black,
unselectedItemColor: Colors.black,
showUnselectedLabels: true,
selectedFontSize: 12,
unselectedFontSize: 12,
iconSize: 28,
type: BottomNavigationBarType.fixed,
items: [
BottomNavigationBarItem(
icon: Icon(Icons.home_filled),
label: '홈',
backgroundColor: Colors.white,
),
BottomNavigationBarItem(
icon: Icon(Icons.my_library_books_outlined),
label: '동네생활',
),
BottomNavigationBarItem(
icon: Icon(Icons.fmd_good_outlined),
label: '내 근처',
),
BottomNavigationBarItem(
icon: Icon(CupertinoIcons.chat_bubble_2),
label: '채팅',
),
BottomNavigationBarItem(
icon: Icon(
Icons.person_outline,
),
label: '나의 당근',
),
],
currentIndex: 0,
),
);
//Center클릭->마우스 오른>Refactor/ctrl ./전구 >Wrap with Row :Center(child: Text("home page"))del
return Center(child: Text('첫번째 페이지'));
}
}
// 두번째 페이지
class SecondTab extends StatelessWidget {
const SecondTab({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(child: Text('두번째 페이지'));
}
}
// 세번째 페이지
class ThirdTab extends StatelessWidget {
const ThirdTab({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(child: Text('세번째 페이지'));
}
}
