묻고 답해요
160만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
StreamBuilder 관련 질문입니다.
강의 중에 snapshot.data를 콘솔에 찍는 부분에 관한건데요!hot reload시 케바케로-flutter: null flutter: Latitude: 37.522327, Longitude: 126.921252flutter: Latitude: 37.522327, Longitude: 126.921252- 와 같이 현재 포지션이 두번 찍힐때가 있는데 이런건 어떤거때문인걸까요?제가 생각하기로는앱 로딩 시 빌드 함수가 실행되면서 getPositionStream()이 실행되나, 위치 잡아오기 전이라 null 반환이후 위치 잡아오면 스트림에 입력되어 위/경도값 반환이게 끝인거같은데 종종 보면 저 위/경도값이 두번 찍힐때가 있더라구요..!이유가 궁금합니다.
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
구글맵 Using the Impeller rendering backend. 에러 뜨시는 분들!
Impeller라는 렌더링 백엔드가 현 앱과 호환되지 않는 경우에 발생할 수 있는 문제라고 합니다. info.plist에 <key>FLTEnableImpeller</key> <false/>추가해주시면 해결됩니다~
-
해결됨Flutter 앱 개발 실전
NotifierProvider 로 변경하고 싶어요
안녕하세요.Riverpod 상태관리에서 StateNotiferProvider 대신에 NotifierProvider를 사용하는 것을 권장하신다고 하셨는데요.StateNotifierProvider 로 작성한 코드를 NotiferProvider 로 변경하고 싶은데 잘 안되어 문의 드립니다. contactStateProvier 코드로는 정상 동작됩니다.이 코드를 NotifierProvider 로 변경해보려고 하는데 잘 안되네요.final contactStateProvider = StateNotifierProvider<ContactStateNotifier, ContactResultBase>( (ref) { final repository = ref.watch(restClientProvider); final notifier = ContactStateNotifier(restClient: repository); return notifier; }, ); class ContactStateNotifier extends StateNotifier<ContactResultBase> { final RestClient restClient; ContactStateNotifier({required this.restClient}) : super(ContactResultLoading()) { postContactList(); } postContactList() async { final resp = await restClient.postContactList( Crypto.AES_encrypt(Crypto.URLkey()), ''); state = resp; } }@RestApi(baseUrl: RetrofitURL.baseUrl) abstract class RestClient { factory RestClient(Dio dio, {String baseUrl}) = _RestClient; @POST(RetrofitURL.mLogin) @FormUrlEncoded() Future<LoginResponse> userLogin( @Field() String keyword, @Field() String userID, @Field() String password, @Field() String uID, @Field() String mfoneNO, ); @POST(RetrofitURL.contactData) @FormUrlEncoded() Future<ContactResult> postContactList( @Field() String keyword, @Field() String search, ); }final secureStorageProvider = Provider<FlutterSecureStorage>((ref) => const FlutterSecureStorage()); final dioProvider = Provider<Dio>((ref) { final dio = Dio(); final storage = ref.watch(secureStorageProvider); dio.interceptors.add(LogInterceptor()); dio.interceptors.add( CustLogInterceptor(storage: storage,), ); return dio; }); final restClientProvider = Provider<RestClient>((ref) { final dio = ref.watch(dioProvider); final repository = RestClient(dio); return repository; }); contactStateProvider 를 변경시도 해보다가 에러가 발생한 코드final contactProvider = NotifierProvider<ContactNotifier, ContactResultBase>( () { final repository = ref.watch(restClientProvider); final notifier = ContactNotifier(restClient: repository); return notifier; }, ); class ContactNotifier extends Notifier<ContactResultBase> { @override ContactResultBase build() => ContactResultLoading(); final RestClient restClient; ContactStateNotifier({required this.restClient}) { postContactList(); } postContactList() async { final resp = await restClient.postContactList( Crypto.AES_encrypt(Crypto.URLkey()), ''); state = resp; } }
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
맥북에서 에뮬, 시뮬레이터 오류들
안녕하세요, 수업 잘 듣고 있습니다.다름이 아니라 이번에는 제가 근무지 이동때문에데스크탑(윈도우)이 아닌 맥북(m1)으로 코딩을 공부하는 중입니다. 현재 가장 최신인 giraffe버전인데, 맥북에서 시뮬레이터로 코딩하면 크롬에서 스웨거도 잘 뜨고, 자동로그인도 잘되어 splashscreen페이지에서 바로 rootTab으로 넘어갑니다. 그런데 그 외의 서버에서 보내오는 이미지나 텍스트 데이터들이 전혀 뜨지 않아 무한 로딩을 합니다ㅠ 그래서 에뮬레이터를 돌려보려고 하니 파일 경로중에 알맞지 않은 문자가 있다는데, 아무리 봐도 '_'(아래바) 제외하고는 전혀 특수문자나 공백은 없습니다.. 에뮬도 안켜지고, 시뮬레이션에 데이터도 안떠서 답답하네요; 도움 구할 곳이 없어 도움 구해봅니다 ㅠ올 한해도 고생 많으셨고, 해피 크리스마스 입니다^^
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
GoRouter Redirection관련 질문이 있습니다..
안녕하세요? 강사님,중급강의 섹션 13. [Go Router v7] GoRouter 이론 중 "Redirection" 파트에 관련된 질문인데요. 9_login_screen.dart 파일(LoginScreen 클래스)에 코딩된 "authState"는router.dart파일에 코딩된 "authState"와 어떤 관계(?)인지를 모르겠습니다. 무슨말인가 하면 authState 변수는 LoginScreen 클래스내에서 별도로 선언을 해주지도 않았는데도 setStat를 이용해서 값을 ture, false로 바꿀 수 있는 것도 이상하고,이렇게 LoginScreen 클래스에서 변경된 authState값이 router.dart파일에서 인식(?)이 되는것도 이상합니다. 제 질문이 조금 무식해 보이긴 한데...제 질문 의도는 파악하셨으리라 생각되어서 답변 좀 부탁드리겠습니다...
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
구글맵 지도 자체는 뜨는데 위치가 안뜨시는분들
API 및 서비스 여기서 Maps SDK for Android랑 iOS 여기서 DISABLE로 되어있어야 활성화 된겁니다! 처음에 ENABLE로 되어야 활성화인줄알고 했다가 계속 안떴었네요! 강사님 이거 자막에 달아주시면 좋을거같습니다 ㅜㅜ
-
미해결Flutter 테스트 기초
GeneratedMocks로 생성한 코드의 위치를 변경하고싶어요
GeneratedMocks로 생성한 코드들이 많아지면 복잡할 것 같아서 생성되는 파일의 위치를 자동으로 변경해주고 싶은데요,예를들면 현재 코드가 있는 디렉토리에 generated라는 디렉토리 안에다가 생성된 파일을 저장해주고싶어요.어떠한 설정을 해야할까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Didupdatewidget
didupdatewidget과 setstate의 차이점을 알려주실 수 있나요? Setstate는 stateful위젯 안에서 변수를 변경하고 싶을때 사용하는건 알겠는데, didupdatewidget은 언재 사용하는지 잘 모르겠어요ㅜㅠ
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
슬라이더를 누르고 있을때 재생안되는 방법
재생 중에 슬라이더를 조절할려고하는데슬라이더를 누른채로 동작을 안하면 영상이 자동으로 재생되어 버립니다슬라이더에서 손을 뗄떼까지 영상이 멈추게 할수있을까요인프런강의처럼요 또 한가지 질문은 videioController 는 initializeController()안에서 아래 코드로 할당이되는데videoController = VideoPlayerController.file( File(widget.video.path),이부분은 deadcode가 아닐까요if (videoController == null) { return CircularProgressIndicator();
-
해결됨Flutter 앱 개발 실전
[문의] ListView.builder 처리
안녕하세요. 처음부터 List<ContactItem> 으로 데이터를 반환받아서 처리해야 하는 것인지, 아니면 아래 코드에서 분기처리할 방법이 있는지 궁금합니다.import 'package:json_annotation/json_annotation.dart'; import 'package:retrofit_ex2/model/contact_item.dart'; part 'contact_result.g.dart'; @JsonSerializable() class ContactResult { final String status; final String message; final List<ContactItem>? addrinfo; const ContactResult({ required this.status, required this.message, this.addrinfo, }); factory ContactResult.fromJson(Map<String, dynamic> json) => _$ContactResultFromJson(json); Map<String, dynamic> toJson() => _$ContactResultToJson(this); }import 'package:dio/dio.dart'; import 'package:retrofit/retrofit.dart'; import 'package:retrofit_ex2/common/repository/retrofit_url.dart'; import 'package:retrofit_ex2/model/contact_result.dart'; part 'rest_client.g.dart'; @RestApi(baseUrl: RetrofitURL.baseUrl) abstract class RestClient { factory RestClient(Dio dio, {String baseUrl}) = _RestClient; @GET(RetrofitURL.contactData) Future<ContactResult> getContactList(); }class ContactListPage extends StatefulWidget { const ContactListPage({Key? key}) : super(key: key); @override State<ContactListPage> createState() => _ContactListPageState(); } class _ContactListPageState extends State<ContactListPage> { late final RestClient restClient; @override void initState() { Dio dio = Dio(); restClient = RestClient(dio); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( body: FutureBuilder<ContactResult>( future: restClient.getContactList(), builder: (BuildContext context, AsyncSnapshot<ContactResult> snapshot) { if (!snapshot.hasData) { return const Center( child: CircularProgressIndicator(), ); } final ids = snapshot.data as ContactResult; //print(ids.runtimeType); if (ids.status.contains("success")) { final addrinfo = ids.addrinfo as List<ContactItem>; print('addrinfo_count ::: ${addrinfo.length}'); // 15개 for(ContactItem item in addrinfo){ print('${item.idx} | ${item.userNM} | ${item.mobileNO} | ${item.photo}'); // 여기서 출력은 잘 됨. } return ListView.builder( itemCount: addrinfo.length, itemBuilder: (context, index) { // 총 15개의 List 데이터를 출력하기 위해서 어떻게 해야하는지요? return Text(''); }, ); } else { return const Center( child: Text('에러가 발생했습니다.'), ); } }, ), ); } Widget _contactListWidget(ContactItem item) { return Column( children: [ Text(item.idx.toString()), Text(item.userNM), Text(item.mobileNO), Text(item.telNO!), Text(item.photo!), ], ); } }15개의 데이터를 GET으로 가져오는 것까지는 잘 되는 걸 확인했습니다.JSON 데이터 전체는 ContactResult 이고, addrinfo 는 List<ContactItem> 입니다.ContactItem 15개를 ListView.builder 를 이용하여 출력하려고 하는데 어떻게 해야 되는지 몰라 도움 요청드립니다.
-
해결됨Flutter 앱 개발 기초
에뮬레이터 관련 질문입니다
처음엔 이 바가 보였는데 어느순간 부터 안보이더라구요.있던게 안보이니 괜히 불안해서 다시 보이게 하는법을 알고싶습니다...;;오픈 카카오톡으로 문의주시면 더 빠르게 답변 받으실 수 있어요 :)
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
CrossAxisAlignment.stretch 질문 있습니다.
CrossAxisAlignment.stretch 는 교차축을 확장시키는 것으로 알고 있는데 이게 왜 가운대 정렬한 것처럼 작동하는지 모르겠습니다.느낌 상으로는 CrossAxisAlignment.center 적용해야 할 것같은데 안되는 이유도 궁금합니다.
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
basketProvider에서 patchBasket 함수 호출 시 에러가 발생합니다
제 코드는 아래와 같고,import 'package:advanced_app/product/model/product_model.dart'; import 'package:advanced_app/user/model/patch_basket_model.dart'; import 'package:advanced_app/user/model/basket_item_model.dart'; import 'package:advanced_app/user/repository/user_me_repository.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:collection/collection.dart'; final basketProvider = StateNotifierProvider<BasketProvider, List<BasketItemModel>>((ref) { final repository = ref.watch(userMeRepositoryProvider); return BasketProvider(repository: repository); }); class BasketProvider extends StateNotifier<List<BasketItemModel>>{ final UserMeRepository repository; BasketProvider({ required this.repository, }):super([]); Future<void> patchBasket () async { await repository.patchBasket( body: PatchBasketBody( basket: state.map( (e) => PatchBasketBodyBasket( productID: e.product.id, count: e.count)) .toList()) ); } Future<void> addToBasket({ required ProductModel product,}) async { // 1 아직 장바구니에 해당 상품이 없는 경우 -> 추가 // 2 동일한 상품이 있는 경우 -> count +1 final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null; if(exists){ state = state .map( (e) => e.product.id == product.id ? e.copyWith(count: e.count +1) : e ).toList(); }else{ state = [ ...state, BasketItemModel( product: product, count:1) ]; } await patchBasket(); } Future<void> removeFromBasket({ required ProductModel product, bool isDelete = false}) async{ // isDelete면 count와 상관없이 삭제 final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null; if(!exists){ return; } // 이제 무조건 있는 경우 final existingProduct = state.firstWhere((element) => element.product.id == product.id); // 1개 있는 경우 삭제 (해당하는 상품 빼고 리스트 만들어서 넣어 주는 방식) if (existingProduct.count == 1 || isDelete){ state = state .where((e) => e.product.id != product.id) .toList(); } else{ // 2개 이상 있는 경우 state = state .map((e) => e.product.id == product.id? e.copyWith( count: e.count -1) : e).toList(); } } }에러 로그는 아래와 같습니다. --------------[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast#0 $BasketItemModelFromJson (package:advancedapp/user/model/basket_item_model.g.dart:11:54)#1 new BasketItemModel.fromJson (package:advanced_app/user/model/basket_item_model.dart:25:14)#2 UserMeRepository.patchBasket.<anonymous closure> (package:advancedapp/user/repository/user_me_repository.g.dart:93:45)#3 MappedListIterable.elementAt (dart:_internal/iterable.dart:415:31)#4 ListIterator.moveNext (dart:_internal/iterable.dart:344:26)#5 new GrowableList.ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)#6 new GrowableList.of (dart:core-patch/growablearray.dart:150:28)#7 new List.of (dart:core-patch/array_patch.dart:47:28)#8 ListIterable.toList (dart:_internal/iterable.dart:214:7)#9 UserMeRepository.patchBasket (package:advancedapp/user/repository/user_me_repository.g.dart:94:10)Postman에서 get http://127.0.0.1:3000/user/me/basket 실행해 보면,[ { "count": 1 } ]처럼 product가 제대로 안들어가고 count 값만 들어가 있습니다. jsonSerializable 문제인가 싶어서 모델들 다 체크해봤는데... 코드 제너레이션도 정상적으로 되는데... 뭐가 문제일까요? 이것 때문에 3시간 넘게 씨름 중인데 도움 주시면 감사하겠습니다!
-
해결됨Flutter 앱 개발 실전
Unhandled Exception: type '_Map<String, dynamic>' is not a subtype of type 'Contact_Item'
안녕하세요. 강의를 듣고나서 테스트를 해보는데 안되어서 문의 좀 드립니다.addrinfo: json['addrinfo'] == null ? null : List<Contact_Item>.from(json['addrinfo']),위 부분을 어떻게 처리해야 해결될 수 있는지를 모르겠습니다.addrinfo 는 값이 서버에서 null을 반환할 수도 있고List<Contact_Item> 을 반환할 수도 있습니다. class Contact_Item { final String idx; final String userNM; final String mobileNO; final String telNO; final String photo; final bool checkBoxState; const Contact_Item({ required this.idx, required this.userNM, required this.mobileNO, required this.telNO, required this.photo, required this.checkBoxState, }); factory Contact_Item.fromJson(Map<String, dynamic> json) { return Contact_Item( idx: json['idx'] as String, userNM: json['userNM'] as String, mobileNO: json['mobileNO'] as String, telNO: json['telNO'] as String, photo: json['photo'] as String, checkBoxState: json['checkBoxState'] as bool, ); } }class ContactResult { final String status; final String message; final List<Contact_Item>? addrinfo; const ContactResult({ required this.status, required this.message, this.addrinfo, }); factory ContactResult.fromJson(Map<String, dynamic> json) { return ContactResult( status: json['status'] ?? '', message: json['message'] ?? '', addrinfo: json['addrinfo'] == null ? null : List<Contact_Item>.from(json['addrinfo']), ); } }abstract class ContactRepo { Future<ContactResult> getAddressData(ContactRequest req); } class ContactService extends ContactRepo { Future<ContactResult> getAddressData(ContactRequest req) async { BaseOptions options = BaseOptions( baseUrl: RetrofitURL.baseUrl, ); Dio dio = Dio(options); dio.interceptors.add(Logging()); FormData formData = FormData.fromMap({ "keyword": req.keyword, "search": req.search, }); final response = await dio.post(RetrofitURL.contactData, data: formData); print(response); // print(response.data.runtimeType); //print(response.headers); if (response.statusCode == 200) { ContactResult result = ContactResult.fromJson(response.data); return result; } else { return ContactResult(status: "fail", message: "fail", addrinfo: null); } } }에러 메시지 내용I/flutter (23550): RESPONSE[200] => PATH: /androidSample/ContactList.phpI/flutter (23550): {"status":"success","message":"","addrinfo":[{"idx":1,"userNM":"개발자","mobileNO":"01000010001","telNO":"0234560001","photo":"1.jpg","checkBoxState":false},{"idx":2,"userNM":"이정은","mobileNO":"01001230001","telNO":"","photo":"2.jpg","checkBoxState":false},{"idx":3,"userNM":"김홍길","mobileNO":"01001230002","telNO":"","photo":"null","checkBoxState":false},{"idx":4,"userNM":"최신형","mobileNO":"01001230003","telNO":"","photo":"4.jpg","checkBoxState":false},{"idx":5,"userNM":"홍길동","mobileNO":"01000009880","telNO":"","photo":"5.jpg","checkBoxState":false},{"idx":6,"userNM":"김아정","mobileNO":"01001230005","telNO":"","photo":null,"checkBoxState":false},{"idx":7,"userNM":"이순신","mobileNO":"01001230006","telNO":"","photo":"7.jpg","checkBoxState":false},{"idx":8,"userNM":"이정민","mobileNO":"01000010887","telNO":"","photo":null,"checkBoxState":false},{"idx":9,"userNM":"최재수","mobileNO":"01001110000","telNO":"","photo":"9.jpg","checkBoxState":false},{"idx":10,"userNM":"장정은"E/flutter (23550): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: type '_Map<String, dynamic>' is not a subtype of type 'Contact_Item'E/flutter (23550): #0 new List.from (dart:core-patch/array_patch.dart:29:5)E/flutter (23550): #1 new ContactResult.fromJson (package:login_ex/contact/model/contact_result.dart:19:51)E/flutter (23550): #2 ContactService.getAddressData (package:login_ex/contact/repository/contact_service.dart:32:44)E/flutter (23550): <asynchronous suspension>E/flutter (23550): #3 MainScreenState.getContactData (package:loginex/contact/view/main_screen.dart:35:30)E/flutter (23550): <asynchronous suspension>
-
미해결[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
이미지 404에러가 발생했습니다~~
══╡ EXCEPTION CAUGHT BY IMAGE RESOURCE SERVICE ╞════════════════════════════════════════════════════ The following NetworkImageLoadException was thrown resolving an image codec: HTTP request failed, statusCode: 404, http://10.0.2.2:3000/img/%EB%96%A1%EB%B3%B6%EC%9D%B4/%EB%96%A1%EB%B3%B6%EC%9D%B4.jpg When the exception was thrown, this was the stack: #0 NetworkImage._loadAsync (package:flutter/src/painting/_network_image_io.dart:135:9) <asynchronous suspension> Image provider: NetworkImage("http://10.0.2.2:3000/img/떡볶이/떡볶이.jpg", scale: 1.0) Image key: NetworkImage("http://10.0.2.2:3000/img/떡볶이/떡볶이.jpg", scale: 1.0) ════════════════════════════════════════════════════════════════════════════════════════════════════어떻게 해야할까요..?
-
해결됨Flutter 중급 1편 - 클린 아키텍처
모델 클래스 작석 시 nullable
json to dart 모델 작성시에nullable 보다 late final로 선언하는 것을 더 선호하신다고 했는데, 이유가 있을까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
섹션24 데이터베이스
섹션24 데이터베이스 수업에서flutter pub run build_runner build를 터미널에 작성해도 새로운 파일이 생성되지 않습니다. 해결 방법이 있을까요?
-
미해결Flutter 입문 - 안드로이드, iOS 개발을 한 번에 (with Firebase)
plugin 중에서 에러 발생시 발생한 코드 위치에 바로 에러 표시해주는 기능 있을까요?
plugin 중에서 에러 발생시 발생한 코드 위치에 바로 에러 표시해주는 기능 있을까요? 어디에선가 본거 같은데 해당 plugin이나 메뉴를 못찾겠네요.
-
해결됨Flutter 앱 개발 실전
노션 주소는 어디서 확인하나요?
노션 주소는 어디서 확인하나요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
CustomScrollView에 TabBar적용시 스크롤하면 여백이 많이생겨요.
안녕하세요.강의를 통해서 CustomScrollView에 TabBar를 적용 해보았는데요. 앱상단에는 컨텐츠를 만들고 중간쯤 탭바를 구현해서각 탭바뷰에 ListViewBuild를 적용 하려 하는데요, TabBarView에 ListView나 ListViewBuild를 적용하면 잘 동작하는데, TabBarView에 들어오는 컨텐츠 내용이 길 경우에는 상관이 없는데, 컨텐츠 내용이 적을 경우 아래 코드처럼 탭1에 컨테이너 높이를 주거나 (SliverFillRemaining 전체 남는 요소를 다채워서 높이값이 안먹고,) 탭2에 텍스트 위젯만 썻을 경우에 화면 스크롤시 현재 남은 공간 외에도 더 많은 공간이 스크롤되서 컨텐츠 내용도 적은데 스크롤이 너무 많이 나타나서. NestedScrollView 도 그렇고 CustomScrollView 그렇고동일한 현상이 나타나서... 기본 스크롤 공간여백을 현재 컨텐츠가 가지고 있는 공간만큼만 스크롤 되게 할 수는 없을까요? 아무리 찾아봐도 해결할 수가 없어서 도움 요청드려요 ㅠ DefaultTabController( length: 2, child: CustomScrollView( slivers: [ SliverList( delegate: SliverChildListDelegate([ Column( children: [ Text('컨텐츠'), Text('컨텐츠'), Text('컨텐츠'), Text('컨텐츠'), Text('컨텐츠'), Text('컨텐츠'), ], ), ]), ), SliverAppBar( floating: true, pinned: true, bottom: TabBar( tabs: [ Tab(text: '탭 1'), Tab(text: '탭 2'), ], ), ), SliverFillRemaining( child: TabBarView( children: [ // 첫 번째 탭에 대한 내용 Container( height: 200, color: Colors.red, ), // 두 번째 탭에 대한 내용 Text('두 번째 탭 내용'), ], ), ) ], ), )