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のコードを準備します。

// 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のコード例

// 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のコード例と見比べて画面構成の知識を深めるのを目的に記事を書きました。

次回は、画面遷移等の制御周りの知識を深めることを記載できれば思います。