Flutter Responsive 타사림
7247 단어 dartflutterresponsivedesign
반응형
Uygulamanın duzeninin mevcut cihazın boyutuna göre uyarlanabilmesi
responsive
bir uygulama olduğu anlamına gelir. Bu durum kullanıcı pencereyi yeniden boyutlandırdığında ya da cihazın yönünü değiştirdiğinde UI'ın yeniden düzenleneceği anlamına gelir. Bu sayede de uygulamanız birden fazla cihazda çalışabilir durumda olur.Responsive Tasarım ile Flutter uygulaması oluşturma konusunda iki temel yaklaşım vardır:
1. 빌드 fonksiyonunda MediaQuery.of() methodunu kullanmak
2. LayoutBuilder는 기본 기능을 제공합니다.
1. MediaQuery.of() 메소드
Sabit yükseklik ve genişlik değerleri kullanmak farklı cihazlarda overflowing (taşma) hatalarına neden olur. Bu nedenle widget'larınızı tasarlarken sabit genişlik ve yükseklik değerleri kullanmaktan kaçınarak oranları (ratios) kullanın.
비율:
Height in Design / Width in Design =
Height in Device / Width in Design
Tasarım yüksekliği / Tasarım genişliği =
Cihaz yüksekliği / Tasarım genişliği
Cihaza duyarlı yükseklik ve genişlik nasıl hesaplanır?
미디어쿼리
Flutter uygulamamızın çalıştığı cihazın yüksekliğini ve genişliğini almak için cihazın boyut bilgisine erişmemizi sağlayan MediaQuery'den faydalanabiliriz.
Flutter는 반응형으로 제작되었습니다.
final MediaQueryData mediaQueryData = MediaQuery.of(context);
final double deviceHeight = mediaQueryData.size.height;
final double deviceWidth = mediaQueryData.size.width;
Cihazın genişliğini öğrendikten sonra yan yana iki kart gösterdiğimiz bir uygulamamız varsa ve kartın responsive genişliğini hesaplamak istiyorsak:
final double responsiveWidth =
(deviceWidth / 2) - padding - (spaceBetween / 2);
공식 kullanabiliriz.
Temel olarak burada genişliği hesaplamak için cihazın toplam genişlik değerini ikiye bölüp padding alanından çıkartıyoruz.
Flutter는 반응형으로 제작되었습니다.
Önceki aşamada elde ettiğimiz responsive genişlik değerini kullanarak responsive yükseklik değerini aşağıdaki gibi elde edebiliriz.
final double responsiveHeight =
(heightInDesign / widthInDesign) * responsiveWidth;
참고:
final MediaQueryData mediaQueryData = MediaQuery.of(context);
final double deviceWidth = mediaQueryData.size.width;
final double heightInDesign = 260;
final double widthInDesign = 170;
final double padding = 18;
final double spaceBetween = 24;
final double responsiveWidth =
(deviceWidth / 2) - padding - (spaceBetween / 2);
final double responsiveHeight =
(heightInDesign / widthInDesign) * responsiveWidth;
return SingleChildScrollView(
child: Padding(
padding: EdgeInsets.symmetric(
horizontal: padding,
),
child: Row(
children: [
Container(
height: responsiveHeight,
width: responsiveWidth,
color: Colors.grey,
child: Column(
children: [
//card content for text and image
],
),
),
SizedBox(
width: spaceBetween,
),
Container(
height: responsiveHeight,
width: responsiveWidth,
color: Colors.grey,
child: Column(
children: [
//card content for text and image
],
),
)
],
),
),
);
2. LayoutBuilder 클래스
상위 위젯에는 boyutuna bağlı olan bir widget ağacı oluşturur가 있습니다.
부모 자녀는 부모 자녀와 자녀 사이에서 자녀를 보호해야 합니다. LayoutBuilder'n son boyutu child'ın boyutuyla eşleşir.
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.blueGrey,
body: LayoutBuilder(
builder: (context, constraints) {
return GridView.count(
crossAxisCount: constraints.maxWidth < 800 ? 1 : 2,
childAspectRatio: 1.7,
padding: const EdgeInsets.all(16),
crossAxisSpacing: 16,
mainAxisSpacing: 16,
children: const [
Card(),
Card(),
Card(),
Card(),
],
);
}
),
);
}
}
örnek kod:
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
static const String _title = 'Flutter Code Sample';
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: _title,
home: MyStatelessWidget(),
);
}
}
class MyStatelessWidget extends StatelessWidget {
const MyStatelessWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('LayoutBuilder Example')),
body: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
if (constraints.maxWidth > 600) {
return _buildWideContainers();
} else {
return _buildNormalContainer();
}
},
),
);
}
Widget _buildNormalContainer() {
return Center(
child: Container(
height: 100.0,
width: 100.0,
color: Colors.red,
),
);
}
Widget _buildWideContainers() {
return Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Container(
height: 100.0,
width: 100.0,
color: Colors.red,
),
Container(
height: 100.0,
width: 100.0,
color: Colors.yellow,
),
],
),
);
}
}
Responsive bir kullanıcı arayüzü oluşturmak için diğer faydalı widget'lar ve sınıflar:
종횡비
CustomSingleChildLayout
CustomMultiChildLayout
피티드박스
분수 크기 상자
LayoutBuilder
미디어쿼리
MediaQueryData
OrientationBuilder
자원:
https://api.flutter.dev/flutter/widgets/MediaQuery/of.html
https://docs.flutter.dev/development/ui/layout/adaptive-responsive
https://api.flutter.dev/flutter/widgets/LayoutBuilder-class.html
https://stacksecrets.com/flutter/learn-to-make-responsive-design-in-flutter
Reference
이 문제에 관하여(Flutter Responsive 타사림), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/gulsenkeskin/flutter-responsive-tasarim-1mk0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)