Menu
CoddyTech

ボタンをグレーアウトする

CoddyのFlutterジャーニー「アプリをインタラクティブにする」セクションの一部。レッスン 21/34。

「最初のボタン」では、onPressed: null によってボタンがグレー表示になりました。今度はアプリの実行中に切り替えられます。ボタンが使えるときはonPressedに関数を渡し、使えないときはnullを渡します。

ElevatedButton(
  onPressed: _count > 0 ? _decrease : null,
  child: const Text('Minus'),
)

? :はメソッドとnullのどちらを使うか選びます。setStateが画面を再構築するたびに比較が再実行されるため、ボタンは自動的にグレー表示になったり、元に戻ったりします。

グレー表示のボタンなら、タップする前に何も起きない理由が伝わります。押せるのに何も起きないボタンは、ただ壊れているように見えてしまいます。

challenge icon

チャレンジ

簡単

カート内のアイテム数が0未満になることがあります。アイテムがないときはRemoveボタンをグレー表示にして、_itemsが0より大きい場合にのみ押せるようにしてください。

自分で試してみよう

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: const HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  const HomePage({super.key});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int _items = 0;

  void _add() {
    setState(() {
      _items++;
    });
  }

  void _remove() {
    setState(() {
      _items--;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Cart')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text('Items: $_items', style: const TextStyle(fontSize: 24)),
            const SizedBox(height: 16),
            ElevatedButton(onPressed: _add, child: const Text('Add')),
            ElevatedButton(onPressed: _remove, child: const Text('Remove')),
          ],
        ),
      ),
    );
  }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

アプリをインタラクティブにするのすべてのレッスン

自分で練習してみよう: Flutterオンラインコンパイラ