본문 바로가기

Flutter29

Post Write 사전 기반 지식1. 왜 글쓰기 폼에서 상태관리가 필요한가?// 나쁜 예: 상태관리 없이 구현하면...void writePost() { // 버튼을 여러 번 눌러도 막을 방법이 없음 // 성공/실패 상태를 관리하기 어려움 // 다른 화면과 데이터 동기화 불가능}// 좋은 예: 상태관리로 구현하면...enum PostWriteStatus { initial, loading, success, failure }// 각 단계별 상태를 명확히 관리// UI가 상태에 따라 자동으로 업데이트2. Riverpod의 핵심 개념Provider: 상태를 제공하는 객체Notifier: 상태를 변경하는 로직을 담당Consumer: Provider의 상태를 감시하는 위젯 2025. 8. 26.
PostList and PostWrite import 'package:flutter/material.dart';import 'package:flutter_blog/providers/global/post/post_list_notifier.dart';import 'package:flutter_blog/ui/pages/post/detail_page/post_detail_page.dart';import 'package:flutter_blog/ui/pages/post/list_page/wiegets/post_list_item.dart';import 'package:flutter_riverpod/flutter_riverpod.dart';// ConsumerWidget = StatelessWidget + Riverpod// ConsumerStatefulWi.. 2025. 8. 22.
SessionNotifier Login:1.Takes username/password.2.Checks if they are valid.3.Talks to the server to log the user in.4.If successful: 4.1. Saves user info and a security token. 4.2. Sets the app state to "logged in". 4.3.Takes the user to the main screen (post list).5.If not: Shows an error message. Join (Sign Up):1.Takes username, email, password.2.Checks if they are valid.3.Talks to the server to create a new .. 2025. 8. 21.
class_blog, Join_form import 'package:flutter/material.dart';import 'package:flutter_blog/providers/form/join_form_notifier.dart';import 'package:flutter_riverpod/flutter_riverpod.dart';import '../../../../../_core/constants/size.dart';import '../../../../widgets/custom_auth_text_form_field.dart';import '../../../../widgets/custom_elavated_button.dart';import '../../../../widgets/custom_text_button.dart';// ConsumerW.. 2025. 8. 20.
Riverpod, Provider and Notifier // 1. Provider(Basic)(non-changable)// 2. No need manualimport 'package:flutter_riverpod/flutter_riverpod.dart';// Type Stability = Generic statefinal productsProvider = Provider>((ref) { return [ "Apple", "Banana", "Milk", "Bread", "Orange", "Watermelon", "Mango", "Strawberry" ];});// Smart and Complex Provider// 상태 먼저 결정해야한다(값 - 객체)// 사과나 바나나 등을 담을수 있는 객체를 설계해야 한다// 상.. 2025. 8. 20.
Data Communication in Flutter User Model Class// User Model Class Design// API 문서 기준으로 설계해 볼 수 있다.class User { int? id; // API에서 누락될수있기때문에 Nullable String? username; String? imgUrl; // profile img is optional String? accessToken; User({ this.id, this.username, this.imgUrl, this.accessToken, }); // json to Dart convert constructor(Named Constructor) // Dart -> json String convert package, map structure con.. 2025. 8. 19.
class_market import 'package:class_market/ch01/theme.dart';import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import '../../models/product.dart';class HomeScreen extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Row( children: [ const Text("전포동"), const SizedBox( .. 2025. 8. 19.
Google Map API v2 import 'package:class_google_map_v1/models/saved_marker.dart';import 'package:class_google_map_v1/services/storage_service.dart';import 'package:flutter/material.dart';class MarkerListScreen extends StatefulWidget { const MarkerListScreen({super.key}); @override State createState() => _MarkerListScreenState();}class _MarkerListScreenState extends State { // Data for list List _markers = [];.. 2025. 8. 18.
MVVM Pattern, Monolithic Architecture MVVM(Model-View-ViewModel)View = UIViewModel = View StatusModel = Business model import 'package:flutter/material.dart';void main() => runApp(const TodoApp());// Monolithic Codeclass TodoApp extends StatelessWidget { const TodoApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: TodoScreen(), ); }}class .. 2025. 8. 18.
Markers on Google Maps(with SharedPreferences) import 'package:class_google_map_v1/models/saved_marker.dart';import 'package:class_google_map_v1/services/storage_service.dart';import 'package:flutter/material.dart';import 'package:google_maps_flutter/google_maps_flutter.dart';import 'package:shared_preferences/shared_preferences.dart';class MapScreen extends StatefulWidget { const MapScreen({super.key}); @override State createState() => _.. 2025. 8. 14.
Google Map API import 'package:flutter/material.dart';import 'package:google_maps_flutter/google_maps_flutter.dart';class MapScreen extends StatefulWidget { const MapScreen({super.key}); @override State createState() => _MapScreenState();}class _MapScreenState extends State { GoogleMapController? _controller; static const LatLng _initCenter = LatLng(35.162439, 129.062293); @override Widget build(BuildCo.. 2025. 8. 13.
Shared Preference(Counter) import 'package:flutter/material.dart';import 'package:shared_preferences/shared_preferences.dart';void main() { runApp(const MyApp());}class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'SharedPrefereces Demo', debugShowCheckedModeBanner: false, home: CountStorage(), ); }}class Count.. 2025. 8. 13.
Androide Studio Setting 2 https://pub.dev/packages/google_maps_flutter google_maps_flutter | Flutter packageA Flutter plugin for integrating Google Maps in iOS and Android applications.pub.dev android/app/src/main/AndroidManifest.xml : pubspec.yaml - dependencies: name: class_google_map_v1description: "A new Flutter project."# The following line prevents the package from being accidentally published to# pub.dev using `f.. 2025. 8. 13.
Camera & Gallery import 'dart:convert';import 'dart:io';import 'package:class_camera_v1/helper/image_helper.dart';import 'package:flutter/material.dart';import 'package:gal/gal.dart';import 'package:image_picker/image_picker.dart';import 'package:http/http.dart' as http;import 'package:path/path.dart' as path;// path package = 파일 경로를 다루는 utility packagevoid main() { runApp(const MyApp());}class MyApp extends St.. 2025. 8. 12.
AirBnC web & app Exercise import 'package:class_airbnb/components/common/common_form_field.dart';import 'package:class_airbnb/constants.dart';import 'package:class_airbnb/size.dart';import 'package:class_airbnb/styles.dart';import 'package:flutter/material.dart';class HomeHeaderForm extends StatelessWidget { const HomeHeaderForm({super.key}); @override Widget build(BuildContext context) { double screenWidth = Media.. 2025. 7. 31.