Flutter(dart)
13253 ワード
Flutterとは?
ダーツとは?
GoogleはJSが開発したWebプログラミング言語に代わるため、Dartを使用してモバイルアプリケーション、Web、アプリケーション、コマンドスクリプト、サーバプログラミングなどを作成することができます.
Android/OSアプリケーションは、Webアプリケーションではなくネイティブコードで同時に開発できます.
すべてが対象とされている.
:varが宣言できるすべて、function、number、nullはオブジェクトとみなされます.
変数に入れることができるすべてのオブジェクトはオブジェクトであり、すべてのオブジェクトはクラスのインスタンスと見なされます.
リストやListのようにGenerickTypeをサポート
タイプ化言語ですが、自由度があり、ダイナミックに基本オブジェクトタイプを任意のように明確に指定できます.
public private protectedは定義されずfunction()として定義されています.
文法上.
print();出力可能
データ型はnumber,double,String,bool,List,Map(key:value)に分けられる.
またvarはタイプを書かず、最初に宣言した値がデータ型です.
しかもfinalとconstは同じですが、ちょっと違います.
Fluterのインストール
2.android studioのインストール
3.環境変数の登録
4.など
/usr/local/Caskroom/flutter/2.10.3/flutter
:パッケージをデスクトップにインストールすると、バージョンの更新が面倒になります.
brew install android-sdk/
brew install android-ndk/
brew install android-studio
brew tap dart-lang/dart
brew install dart
Fluter構造
lib:skeletonアプリケーションを含むコードで、以降のコード実装はほとんどこのフォルダで行われます.
pubspec.yaml:アプリケーション名、バージョン、構築、依存性(dependencies)、リソース(画像、フォントファイルなど)を登録したファイルです.
StatelessWidgetクラス
:ステータスのないコンポーネントを定義します.
これは,無状態の部品を構成する基本クライスが1回描くと二度と描かれないことを意味する.
これらのクラスは定数を有することができるが、propertyとして変数を持たない.
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Welcome to Flutter',
theme:ThemeData(primarySwatch:Colors.blue,
home: Scaffold( ··· );
),
);
}
}
Statefulクラス
:ステータスを持つコンポーネントを定義します.
ライフサイクルで値が可変なコンポーネントとして、Stateインスタンスを生成するStatefulWidgetクラスを生成する必要があります.自身の値は変わりませんが、内部のstateクラスのライフサイクルでの値が変わります.
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ···,
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
Flutter LifeCycle
statefulWidgetの作成時にstateオブジェクトを作成します.部品のすべての可変状態はこの位置に保持されます.
:stateは再構築のたびに破棄されず、フレームワークを再構築するたびにstateプロパティ、getter、settなどからインポートされます.
createState()
:コンストラクションを示すと、すぐにメソッドが呼び出され、そのメソッドが存在する必要があります.
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => new _MyHomePageState();
}
mounted == true
:createStateがstateクラスを作成した場合、buildContextはstateに割り当てられます.
すべての部品はbool形式のthisです.マウント属性があります.(setState()を使用する場合に便利)
initState()
:部品の作成時に最初に呼び出されるメソッド.コールは1回しかありません.super.initState()を呼び出す必要があります.
@override
initState() {
// 부모의 initState호출
super.initState();
// 이 클래스애 리스너 추가
cartItemStream.listen((data) {
_updateWidget(data);
});
}s
didChangeDependencies()
:コンポーネントが最初に作成されると、initStateの直後に呼び出されます.
依存するデータ・オブジェクトが呼び出されるたびに呼び出されます.(API呼び出しの場合)
build()
:部品を返さなければなりませんが、fluiterのguiはすべてchild/childrenを持つ部品です.
didUpdateWidget()
:親部品が変更され、部品を再構成する必要がある場合は、データとステータスの一部を再定義または初期化する必要があります.
@override
void didUpdateWidget(Widget oldWidget) {
if (oldWidget.importantProperty != widget.importantProperty) {
_init();
}
}
setState()
:build contextのコンポーネントが再ネストされ、非同期コールバックが使用されます.
deactivate()
:あまり使用されませんが、ツリーからstateを削除するときに呼び出されます.
void updateProfile(String name) {
setState(() => this.name = name);
}
dispose()
:stateオブジェクトは永続的に削除されます.
mounted == false
:この状態では、ステータスオブジェクトは再マウントされず、setState()を呼び出すとエラーが発生します.
省道文法
道の中にコンテナを2つ入れることができます.
body: Row(
children:[
Flexible(child: Container( width: )),
Container()
]
)
children:[
Flexible(child: Container(color: Colors.blue ), flex: 3,),
Flexible(child: Container(color: Colors.green ), flex: 7,),
]
//=>이런식으로 css를 줄수있고 박스 2개를 3:7로 나눈다.
children:[
Expanded(child: Container(color: Colors.blue )),
Container(width: 100, color: Colors.green ),
]
//=>Expanded는 flex:1을 가진박스랑 똑같다.
へんすう
int
Double
Num
Bool
String
List
Set
Map
dynamic
dynamic some =9;
some = 'apple'
ㄴ> 다이나믹으로 선언해주면 모든 형식타입을 허용한다.
String name;
Int age;
List<int> number = [0,1,2]
Map<String, int> score = {
‘en’: 100,
‘math’: 90,
}
String greet(){
print(‘hello’);
return ‘hello’;
}
演算子
~/
print(55~2) // 27
As
ㄴ>강제 형변환 키워드로
부모 타입 객체를 자식 타입 객체로 다운캐스팅 할떄 사용한다.
int n = 34;
double m = n as double;
Is/is! Age is int. / age is! Num
ㄴ> 타입을 확인해 true / false를 반환
Name?.length
ㄴ> 널인경우 에러를막고 값을 할당시킨다.
Name ?? 20
ㄴ> name이 null이면 20을 반환 값이 있으면 그 값을 반환.
스프레드 연산자
Var a = [1,2,3];
Var b = […a,4,5];
かんすう
String see(String name){
return ‘Hi $name’;
}
또는
String see(String name) => ‘hi $name’;
Named parameter
{{}}파라미터를 중괄호로 감싸면 파라미터를 전달할수있다.
Void introduce({required String name, required int age}){
}
Optional parameter
[]대괄호로 감싸면 선택형 인자를 설정할수있다.
Void inroduces(String name, int age, [String? food]) {
}
Default parameter
Void inroduce(String name, int age, [String food = ‘whole’]){
}
Null Safety(flutter 2.0)
기본값 초기화 없이 선언하는 변수는 null값에 대한 안정성을 보장하기 위해서
타입을 nullable과 non-nullable로 구분해줘야한다.
*Nullable
일반 타입 뒤에 물음표를 붙여주면 해당 변수는 타입 또는 null이 될수있음을 나타낸다. 초기화없이 사용하면 null값으로 할당된다.
void main() {
String? name;
int? age;
bool? student;
print(name) //null
}
*non-nullable
물음표없이 일반 타입으로 사용하면 자동적으로 nul이 될수없는 값으로 인식된다.
사용전에 반드시 초기값을 할당해줘야한다.
Required, late
Required
함수에서 네임드 파라미터나 옵셔널 파라미터를 설정할때 non-nullable로
지정하기위해 타입 앞에 붙여준다.
Void greet({required String name}){
print(‘hello’);
}
Late
클래스에 non-nullable 프로퍼티가 필요하지만 디폴트값이나 초기화를 시키지 않을 경우 나중에 값을 할당한다는 의미로 붙여준다.
Class Cat{
late String name;
late int age;
}
重要な方法
Var list = [1,2,3,4];
Var newList = list;
print(newList);
Var spreadList = [10, …list, 100];
print(spreadList);
-map
map은 iterable(배열그룹)을 대상으로 foreach돌린다.
Var list = [1,2,3];
Var newList = list.map((e) => e+1);
list[0] = 0;
-asMap
배열 값에 index키 값을 삽입해줘서 반환해준다.
키값은 인덱스로 부여된다. 0부터 시작한다.
Var map = words.asMap();
-toList
생성되는 값들을 리스트로 만들어 반환한다.
List zero = orderList.toList();
Map.keys.toList() => [0,1,2,3];
-where
배열요소를 필터링한다.
Var list = [1,2,3,4];
Var filter = list.where((e) => e!=3);
//3이 아닌값만 필터링한다.
Print(filter); => [1,2,4];
-for / foreach
for(var e in list){
print(e);
}
List.forEach((e) => print(e));
-add / addAll / length / clear
Var vege = List();
생성자 사용
Var fruits = [‘apple’, ‘orange’];
문자열 사용하여 list생성
Fruits.add(‘kiwi’);
Fruits.addAll([‘grape’, ‘banana’]);
다수항목 추가하기
Var appleIndex = fruits.indexOf(‘apple’);
Fruits.removeAt(appleIndex);
리스트 단일 항목 삭제
Fruits.clear();
모든 항목 삭제
-sort
Fruits.sort((alb) => a.compareTo(b));
[‘b’, ‘banana’,a] => [a, b, banana’]이런식으로 순서대로 정렬된다.
-reduce
Int sum = number.reduce((total, element) => total + element);
テキスト(「こんにちは」)
Image.asset(‘assets/electron.png’)
pub spec.yamlファイルにアクセス
途中でflufを探します:
Flutter:
Assets:
-assets/
登録します.
Icon(Icons.star)またはIcon(Icons.shop)
Container( width: 50 , height: 50, color : Colors.blue)
home: Center(
child: Container( width: 50 , height: 50, color : Colors.blue),
(Cupertinoパーツもあります.
またはカスタマイズした部品)
上下部品
-頭部ボディプロペラとして使えばいい.
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text(‘앱이다.’)),
body: Container(),
bottomNavigationBar: BottomAppBar(
child: Text('asdfdee')),
)
displayのような要素を並べたときに書きます.
body: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ ],
body: SizedBox(
child: Icon(Icons.star,)
//아이콘은 컬러와 사이즈가 끝이다.
child: Text('안녕하세요',
style: TextStyle(color: Color(0xffd52727),
fontSize: 30, fontWeight: FontWeight.w700
),
),
),
Button(CSS)
: TextButton(child: Text(), onPressed: (){},)
안에는 2가지 옵션은 꼭 들어가야된다.
/ IconButton() / ElevatedButton()
이렇게 3가지를 쓸수있다.
1)TextButton
child: TextButton(
child: Text('글자'),
onPressed: (){},)
2)ElevatedButton
child: ElevatedButton(
child: Text('글자'),
onPressed: (){},
style: ButtonStyle(),
)
3)IconButton
child: IconButton(
icon: Icon(Icons.star),
onPressed: (){},)
appBar(Header)(CSS)
:オプション
見出し:左見出し
Leading:左側に配置するアイコン(ドロップダウンバーなど)
Actions:[右アイコン]
AppBar(
leading: Icon(Icons.star),
Title: text(‘앱이다.’),
actions: [Icon(Icons.star), Icon(Icons.star)]
),
カスタムコンポーネント構文
カスタムコンポーネントはclassによって作成されます.
:下の直接使用する部分を組み合わせる
関数のように使います.
繰り返し使用するのは、多くのUIまたは大きなページを主とします.
@override
함수를 쓰면서 중복되었을때
내꺼 먼저 써달라는 기호이다.
1)
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: ShopItem()
)
);
}
}
class ShopItem extends StatelessWidget {
const ShopItem({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SizedBox(
child: Text('안녕'),
);
}
}
2)변수로 선언해줘도 a 라고 써주면 사용 가능하다.
But 실시간으로 바뀌는 데이터들은 저렇게 변수 선언해서
사용하면 버그가 많이 생긴다.
var a = SizedBox(
child: Text('안녕'),
);
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(),
body: a
)
);
}
}
Reference
この問題について(Flutter(dart)), 我々は、より多くの情報をここで見つけました https://velog.io/@jihs2113/Flutterdartテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol