Skip to content

Commit

Permalink
#4 Feat: 게시물 작성화면 기능 구현
Browse files Browse the repository at this point in the history
- validator새로 생성
- textarea를 위한 위젯생성
- Fix: overflow view수정
  • Loading branch information
Jinyshin committed Nov 19, 2023
1 parent 23d337f commit f73d0bb
Show file tree
Hide file tree
Showing 4 changed files with 142 additions and 58 deletions.
28 changes: 27 additions & 1 deletion unibond/lib/screens/community/post_write_screen.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:unibond/screens/home_screen.dart';
import 'package:unibond/util/validator_util.dart';
import 'package:unibond/widgets/custom_text_form_field.dart';
import 'package:unibond/widgets/custom_textarea.dart';
import 'package:unibond/widgets/custon_elevated_button.dart';

class WriteScreen extends StatelessWidget {
const WriteScreen({super.key});
final _formKey = GlobalKey<FormState>();
WriteScreen({super.key});

@override
Widget build(BuildContext context) {
Expand All @@ -17,6 +23,26 @@ class WriteScreen extends StatelessWidget {
},
),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Form(
key: _formKey,
child: ListView(
children: [
CustomTextFormField(hint: "제목", funvalidator: validateTitle),
CustomTextArea(hint: "내용", funvalidator: validateContent),
CustomElevatedButton(
text: "작성 완료",
screenRoute: () {
if (isValid(_formKey)) {
Get.off(() => const HomeScreen());
}
},
),
],
),
),
),
);
}
}
116 changes: 59 additions & 57 deletions unibond/lib/screens/home_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,71 +37,73 @@ class HomeScreen extends StatelessWidget {
end: Alignment.bottomCenter,
),
),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
const SizedBox(height: 100),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
height: 120,
width: 170,
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFF7A34AC), Color(0xFF87ADFF)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
border: Border.all(
width: 5,
color: Colors.white,
),
borderRadius: BorderRadius.circular(30),
),
child: const Padding(
padding: EdgeInsets.all(12.0),
child: Text(
"질문",
style: TextStyle(
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
const SizedBox(height: 100),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
height: 120,
width: 170,
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFF7A34AC), Color(0xFF87ADFF)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
border: Border.all(
width: 5,
color: Colors.white,
fontSize: 18,
),
borderRadius: BorderRadius.circular(30),
),
),
),
const SizedBox(width: 20),
Container(
height: 120,
width: 170,
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFFFF6292), Color(0xFFFFF1DF)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
child: const Padding(
padding: EdgeInsets.all(12.0),
child: Text(
"질문",
style: TextStyle(
color: Colors.white,
fontSize: 18,
),
),
),
// border: Border.all(
// width: 0,
// ),
borderRadius: BorderRadius.circular(30),
),
child: const Padding(
padding: EdgeInsets.all(12.0),
child: Text(
"경험기록",
style: TextStyle(
color: Colors.white,
fontSize: 18,
const SizedBox(width: 20),
Container(
height: 120,
width: 170,
decoration: BoxDecoration(
gradient: const LinearGradient(
colors: [Color(0xFFFF6292), Color(0xFFFFF1DF)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
// border: Border.all(
// width: 0,
// ),
borderRadius: BorderRadius.circular(30),
),
child: const Padding(
padding: EdgeInsets.all(12.0),
child: Text(
"경험기록",
style: TextStyle(
color: Colors.white,
fontSize: 18,
),
),
),
),
),
],
],
),
),
),
],
],
),
),
),
),
Expand Down Expand Up @@ -164,7 +166,7 @@ class HomeScreen extends StatelessWidget {
),
floatingActionButton: FloatingActionButton.extended(
onPressed: () {
Get.to(() => const WriteScreen());
Get.to(() => WriteScreen());
},
elevation: 4,
label: const Text('글쓰기'),
Expand Down
20 changes: 20 additions & 0 deletions unibond/lib/util/validator_util.dart
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,23 @@ Function validatePassword = (String? value) {
return null;
}
};

Function validateTitle = (String? value) {
if (value == null || value.isEmpty) {
return "값을 입력해주세요.";
} else if (value.length > 30) {
return "제목은 30자 이하로 입력해주세요.";
} else {
return null;
}
};

Function validateContent = (String? value) {
if (value == null || value.isEmpty) {
return "값을 입력해주세요.";
} else if (value.length > 500) {
return "내용은 500자 이하로 입력해주세요.";
} else {
return null;
}
};
36 changes: 36 additions & 0 deletions unibond/lib/widgets/custom_textarea.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';

class CustomTextArea extends StatelessWidget {
final String hint;
final funvalidator;

const CustomTextArea(
{super.key, required this.hint, required this.funvalidator});

@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 5.0),
child: TextFormField(
maxLines: 14,
validator: funvalidator,
style: const TextStyle(fontSize: 14),
decoration: InputDecoration(
hintText: "$hint을(를) 입력하세요",
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
focusedErrorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20),
),
),
),
);
}
}

0 comments on commit f73d0bb

Please sign in to comment.