Flutterを使ってみよう その4
公開日: 2024/10/9
前回の開発前準備の記事の続きです。
今回は、様々なWidgetを使い、画面構成の知識を深めていきましょう。
※用例で比較説明したほうがわかりよいため、SwiftUIの用例で比較したいため、SwiftUIで開発したことがあることが前提の記事です
環境
・MacOS Ventura 13.6.3
・Xcode 15.1
・VSCode 1.85.1
・Flutter 3.16.5
・Dart 3.2.3
1. 基本的なサンプルコードでの説明
まず、テキストだけ(“Hello, World!”)を表示するFlutterのコードを準備します。
前回まで外枠は、 MaterialApp を使っていましたが、 CupertinoApp を使います。
Flutterでは、「マテリアルデザイン」をコンセプトにしたアプリを作る場合は、 MaterialApp を使い、iOSのUI/UXデザインに特化したデザインにしたいアプリの場合は、 CupertinoApp を使います。
今回は、画面表示で比較しやすいように CupertinoApp を使います。
続いて、同じ内容をSwiftUIで実装すると、下記のようなコードになります。
結果、iOSシミュレータ(iPhone15サイズ)で表示させた内容を比較すると、下記のようになります。
Flutterの画面の作り方の基礎は、前回どおりですので、割愛します。
コードを比べてみると、大まかに下記のキーワードで対応することがわかります。
・Flutterの main とSwiftUIの @main
・Flutterの M
// Flutterのコード
// インポートとか省略
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const CupertinoApp(
home: HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: Text(
'Hello, World!',
),
),
);
}
}
前回まで外枠は、 MaterialApp を使っていましたが、 CupertinoApp を使います。
Flutterでは、「マテリアルデザイン」をコンセプトにしたアプリを作る場合は、 MaterialApp を使い、iOSのUI/UXデザインに特化したデザインにしたいアプリの場合は、 CupertinoApp を使います。
今回は、画面表示で比較しやすいように CupertinoApp を使います。
続いて、同じ内容をSwiftUIで実装すると、下記のようなコードになります。
// SwiftUIのコード
// インポートとか省略
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
HomePageView()
}
}
}
struct HomePageView: View {
var body: some View {
Text("Hello, world!")
}
}
結果、iOSシミュレータ(iPhone15サイズ)で表示させた内容を比較すると、下記のようになります。
Flutterの画面の作り方の基礎は、前回どおりですので、割愛します。
コードを比べてみると、大まかに下記のキーワードで対応することがわかります。
・Flutterの main とSwiftUIの @main
・Flutterの M
2. ボタン
FlutterとSwiftUIのコード例を下記に記載します。(スクリーンショットは割愛)
※ Flutter で print を使うと、デフォルトだとワーニングが表示されるため、analysis_options.yaml ファイルの avoid_print を修正します
ボタンは、Flutterでは、iOSライクのボタンの CupertinoButton ウィジェットを使い、SwiftUIでは、Button ビューに相当します。
Flutterのコード例
// Flutterのコード
// インポートとか省略
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child:
CupertinoButton(
onPressed: () {
print('Tapped');
},
child: const Text('Do something'),
),
),
);
}
}
※ Flutter で print を使うと、デフォルトだとワーニングが表示されるため、analysis_options.yaml ファイルの avoid_print を修正します
linter:
rules:
avoid_print: false # Uncomment to disable the `avoid_print` rule
SwiftUIのコード例
// SwiftUIのコード
// インポートとか省略
struct HomePageView: View {
var body: some View {
Button {
print("Tapped")
} label: {
Text("Do something")
}
}
}
ボタンは、Flutterでは、iOSライクのボタンの CupertinoButton ウィジェットを使い、SwiftUIでは、Button ビューに相当します。
3. 水平や垂直のコンポーネント整列
FlutterとSwiftUIのコード例を下記に記載します。
Flutterのコード例
// Flutterのコード
// インポートとか省略
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child:
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(CupertinoIcons.globe),
Text('Column!!'),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(CupertinoIcons.alarm),
Text('Row!'),
],
)
],
),
),
);
}
}
SwiftUIのコード例
// SwiftUIのコード
// インポートとか省略
struct HomePageView: View {
var body: some View {
VStack {
Image(systemName: "globe").foregroundColor(.blue)
4. リスト表示
FlutterとSwiftUIのコード例を下記に記載します。
Flutterのコード例
// Flutterのコード
// インポートとか省略
class Person {
String name;
Person(this.name);
}
var items = [
Person('Person 1'),
Person('Person 2'),
Person('Person 3'),
];
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body:
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].name),
);
},
),
);
}
}
SwiftUIのコード例
// SwiftUIのコード
// インポートとか省略
struct Person: Identifiable {
var id: String { name }
var name: String
}
struct HomePageView: View {
let persons = [
Person(name: "Person 1"),
Person(name: "Person 2"),
Person(name: "Person 3"),
]
var body: some View {
List {
ForEach(persons) { person in
Text(person.name)
}
}
5. スクロール表示
FlutterとSwiftUIのコード例を下記に記載します。
Flutterのコード例
// Flutterのコード
// インポートとか省略
class Person {
final String name;
final int age;
const Person({
required this.name,
required this.age,
});
}
class PersonView extends StatelessWidget {
final Person person;
const PersonView({
super.key,
required this.person,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
Row(
children: [
const Text('Name:'),
Text(person.name),
],
),
Row(
children: [
const Text('Age:'),
Text(person.age.toString()),
],
),
const Divider(),
],
);
}
}
final mockPersons = Iterable.generate(
20,
(index) => Person(
name: 'Person #${index + 1}',
age: 10 + index,
),
);
class HomePage extends StatelessWidget {
const HomePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
&
6. まとめ
今回は、よく使うWidgetを使い、SwiftUIのコード例と見比べて画面構成の知識を深めるのを目的に記事を書きました。
次回は、画面遷移等の制御周りの知識を深めることを記載できれば思います。