ProfileApp - 기본 셋팅하기

송민경's avatar
Apr 11, 2024
ProfileApp - 기본 셋팅하기

1. 파일 구조 잡기

notion image
 

2. 사진 경로 설정하기

notion image
 

3.

import 'package:flutter/material.dart'; const MaterialColor primaryWhite = MaterialColor( 0xFFFFFFFF, <int, Color>{ 50: Color(0xFFFFFFFF), 100: Color(0xFFFFFFFF), 200: Color(0xFFFFFFFF), 300: Color(0xFFFFFFFF), 400: Color(0xFFFFFFFF), 500: Color(0xFFFFFFFF), 600: Color(0xFFFFFFFF), 700: Color(0xFFFFFFFF), 800: Color(0xFFFFFFFF), 900: Color(0xFFFFFFFF), }, ); ThemeData theme() { return ThemeData( primarySwatch: primaryWhite, appBarTheme: AppBarTheme( iconTheme: IconThemeData(color: Colors.blue), ), ); }
 

4. main

import 'package:flutter/material.dart'; import 'package:profile_app/theme.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( theme: theme(), home: ProfilePage(), ); } } class ProfilePage extends StatelessWidget { const ProfilePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( body: Column( children: [ ], ), ); } }
notion image
import 'package:flutter/material.dart'; class ProfileDrawer extends StatelessWidget { const ProfileDrawer({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Container( width: 200, height: double.infinity, color: Colors.blue, ); } }
import 'package:flutter/material.dart'; class ProfileHeader extends StatelessWidget { const ProfileHeader({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Row( // 1 children: [ SizedBox(width: 20), _buildHeaderAvatar(), SizedBox(width: 20), _buildHeaderProfile(), ], ); } Widget _buildHeaderAvatar() { return SizedBox(); } Widget _buildHeaderProfile() { return SizedBox(); } }
import 'package:flutter/material.dart'; class ProfileCountInfo extends StatelessWidget { const ProfileCountInfo({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildInfo("50", "Posts"), _buildLine(), _buildInfo("10", "Likes"), _buildLine(), _buildInfo("3", "Share"), ], ); } Widget _buildInfo(String count, String title) { return SizedBox(); } Widget _buildLine() { return SizedBox(); } }
import 'package:flutter/material.dart'; class ProfileButtons extends StatelessWidget { const ProfileButtons({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildFollowButton(), _buildMessageButton(), ], ); } Widget _buildFollowButton() { return SizedBox(); } Widget _buildMessageButton() { return SizedBox(); } }
import 'package:flutter/material.dart'; import 'package:profile_app_2/theme.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: theme(), home: ProfilePage(), ); } } class ProfilePage extends StatelessWidget { const ProfilePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( //ProfileDrawer() //AppBar() body: Column( children: [ //ProfileHeader() //ProfileCountInfo() //ProfileButtons() //ProfileTab() ], ), ); } }
notion image
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ProfileDrawer extends StatelessWidget { const ProfileDrawer({super.key}); @override Widget build(BuildContext context) { return Container( width: 200, height: double.infinity, color: Colors.blue, ); } }
import 'package:flutter/material.dart'; import 'package:profile_app_2/theme.dart'; import 'components/profile_drawer.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: theme(), home: ProfilePage(), ); } } class ProfilePage extends StatelessWidget { const ProfilePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( endDrawer: ProfileDrawer(), //AppBar() body: Column( children: [ //ProfileHeader() //ProfileCountInfo() //ProfileButtons() //ProfileTab() ], ), ); } }
import 'package:flutter/cupertino.dart'; class ProfileHeader extends StatelessWidget { const ProfileHeader({super.key}); @override Widget build(BuildContext context) { return Row( children: [ SizedBox(width: 20), _buildHeaderAvatar(), SizedBox(width: 20), _buildHeaderProfile(), ], ); } Widget _buildHeaderAvatar() { return SizedBox(); } Widget _buildHeaderProfile() { return SizedBox(); } }
import 'package:flutter/cupertino.dart'; class ProfileCountInfo extends StatelessWidget { const ProfileCountInfo({super.key}); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildInfo("50", "Post"), _buildLine(), _buildInfo("10", "Likes"), _buildLine(), _buildInfo("3", "Share"), ], ); } Widget _buildInfo(String count, String title){ return SizedBox(); } Widget _buildLine(){ return SizedBox(); } }
import 'package:flutter/cupertino.dart'; class ProfileButtons extends StatelessWidget { const ProfileButtons({super.key}); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildFllowButton(), _buildMessageButton(), ], ); } Widget _buildFllowButton() { return SizedBox(); } Widget _buildMessageButton() { return SizedBox(); } }
import 'package:flutter/cupertino.dart'; class ProfileTab extends StatefulWidget { const ProfileTab({super.key}); @override _ProfileTabState createState() => _ProfileTabState(); } class _ProfileTabState extends State<ProfileTab> { @override Widget build(BuildContext context) { return Column( children: [ _buildTabBar(), _buildTabBarView(), ], ); } Widget _buildTabBar() { return SizedBox(); } Widget _buildTabBarView() { return SizedBox(); } }
import 'package:flutter/material.dart'; import 'package:profile_app_2/theme.dart'; import 'components/profile_buttons.dart'; import 'components/profile_count_info.dart'; import 'components/profile_drawer.dart'; import 'components/profile_header.dart'; import 'components/profile_tab.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: theme(), home: ProfilePage(), ); } } class ProfilePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( endDrawer: ProfileDrawer(), //AppBar() body: Column( children: [ SizedBox(height: 20), ProfileHeader(), SizedBox(height: 20), ProfileCountInfo(), SizedBox(height: 20), ProfileButtons(), SizedBox(height: 20), ProfileTab(), Expanded(child: ProfileTab()), ], ), ); } AppBar _buildProfileAppBar(){ return AppBar(); } }
import 'package:flutter/material.dart'; import 'package:profile_app_2/theme.dart'; import 'components/profile_buttons.dart'; import 'components/profile_count_info.dart'; import 'components/profile_drawer.dart'; import 'components/profile_header.dart'; import 'components/profile_tab.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return MaterialApp( theme: theme(), home: ProfilePage(), ); } } class ProfilePage extends StatelessWidget { const ProfilePage({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( endDrawer: ProfileDrawer(), appBar: _buildProfileAppBar(), body: Column( children: [ SizedBox(height: 20), ProfileHeader(), SizedBox(height: 20), ProfileCountInfo(), SizedBox(height: 20), ProfileButtons(), Expanded(child: ProfileTab()), ], ), ); } AppBar _buildProfileAppBar() { return AppBar( leading: Icon(Icons.arrow_back_ios), title: Text("Profile"), centerTitle: true, ); } }
notion image
notion image
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ProfileHeader extends StatelessWidget { const ProfileHeader({super.key}); @override Widget build(BuildContext context) { return Row( children: [ SizedBox(width: 20), _buildHeaderAvatar(), SizedBox(width: 20), _buildHeaderProfile(), ], ); } Widget _buildHeaderAvatar() { return SizedBox( width: 100, height: 100, child: CircleAvatar( backgroundImage: AssetImage("assets/avatar.png"), ), ); } Widget _buildHeaderProfile() { return SizedBox(); } }
notion image
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ProfileHeader extends StatelessWidget { const ProfileHeader({super.key}); @override Widget build(BuildContext context) { return Row( children: [ SizedBox(width: 20), _buildHeaderAvatar(), SizedBox(width: 20), _buildHeaderProfile(), ], ); } Widget _buildHeaderAvatar() { return SizedBox( width: 100, height: 100, child: CircleAvatar( backgroundImage: AssetImage("assets/avatar.png"), ), ); } Widget _buildHeaderProfile() { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "GetInThere", style: TextStyle( fontSize: 25, fontWeight: FontWeight.w700, ) ), Text( "데어 프로그래밍", style: TextStyle(fontSize: 15, ), ) ], ); } }
notion image
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class ProfileCountInfo extends StatelessWidget { const ProfileCountInfo({super.key}); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildInfo("50", "Post"), _buildLine(), _buildInfo("10", "Likes"), _buildLine(), _buildInfo("3", "Share"), ], ); } Widget _buildInfo(String count, String title){ return Column( children: [ Text( count, style: TextStyle(fontSize: 15), ), SizedBox(height: 2), Text( title, style: TextStyle(fontSize: 15), ) ], ); } Widget _buildLine(){ return Container( width: 2, height: 60, color: Colors.blue ); } }
notion image
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; class ProfileButtons extends StatelessWidget { const ProfileButtons({super.key}); @override Widget build(BuildContext context) { return Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ _buildFllowButton(), _buildMessageButton(), ], ); } Widget _buildFllowButton() { return InkWell( onTap: (){ print("Follow 버튼 클릭됨"); }, child: Container( alignment: Alignment.center, width: 150, height: 45, child: Text( "Follow", style: TextStyle(color: Colors.white), ), decoration: BoxDecoration( color: Colors.blue, borderRadius: BorderRadius.circular(10) ), ), ); } Widget _buildMessageButton() { return InkWell( onTap: (){ print("Message 버튼 클릭됨"); }, child: Container( alignment: Alignment.center, width: 150, height: 45, child: Text( "Message", style: TextStyle(color: Colors.black), ), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10), border: Border.all(), ), ), ); } }
notion image
notion image
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; class ProfileTab extends StatefulWidget { const ProfileTab({super.key}); @override _ProfileTabState createState() => _ProfileTabState(); } class _ProfileTabState extends State<ProfileTab> with SingleTickerProviderStateMixin { TabController? _tabController; @override void initState() { super.initState(); _tabController = new TabController(length: 2, vsync: this); } @override Widget build(BuildContext context) { return Column( children: [ _buildTabBar(), Expanded(child: _buildTabBarView()), ], ); } Widget _buildTabBar() { return TabBar( controller: _tabController, tabs: [ Tab(icon: Icon(Icons.directions_car)), Tab(icon: Icon(Icons.directions_transit)), ], ); } Widget _buildTabBarView() { return TabBarView(controller: _tabController, children: [ Container(color: Colors.green), Container(color: Colors.red), ]); } }
notion image
notion image
import 'package:flutter/material.dart'; class ProfileTab extends StatefulWidget { const ProfileTab({Key? key}) : super(key: key); @override State<ProfileTab> createState() => _ProfileTabState(); } class _ProfileTabState extends State<ProfileTab> with SingleTickerProviderStateMixin { @override Widget build(BuildContext context) { return Column( children: [ _buildTabBar(), Expanded(child: _buildTabBarView()), ], ); } TabController? _tabController; @override void initState() { super.initState(); _tabController = new TabController(length: 2, vsync: this); } Widget _buildTabBar() { return TabBar( controller: _tabController, tabs: [ Tab( icon: Icon( Icons.directions_car, )), Tab( icon: Icon( Icons.directions_transit, )), ], ); } Widget _buildTabBarView() { return TabBarView( controller: _tabController, children: [ GridView.builder( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisSpacing: 10, crossAxisCount: 3, mainAxisSpacing: 10, ), itemCount: 42, itemBuilder: (context, index) { return Image.network( "https://picsum.photos/id/${index + 1}/200/200"); }, ), Container(color: Colors.red), ], ); } }
notion image
Share article

vosw1