Menu
CoddyTech

用开关控制开和关

本课属于 Coddy Flutter 学习旅程的“让应用具有交互性”单元。第 27 课,共 34 课。

Switch 是你在手机设置中熟悉的开关。它显示一个布尔值,并在有人切换它时通知你:

Switch(
  value: _wifi,
  onChanged: (bool value) {
    setState(() {
      _wifi = value;
    });
  },
)

value: 决定开关的显示位置:值为 true 时打开,为 false 时关闭。点击开关后,onChanged 会获取新的值。

开关不会自动移动。点击只会调用 onChanged;你需要用 setState 保存新值,然后重新构建屏幕,开关才会显示在新的位置。如果忘了这一步,每次点击开关后,它都会弹回原位。

challenge icon

挑战

简单
  • 让开关正常工作:使用 setState 将新值存储到 _dark 中。
  • 深色模式开启时,将 Scaffold 的 backgroundColor 设为 Colors.black;关闭时设为 Colors.white。标签的颜色已经会改变。

亲手试试

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> {
  bool _dark = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(title: const Text('Settings')),
      body: Center(
        child: Row(
          mainAxisSize: MainAxisSize.min,
          children: [
            Text(
              'Dark mode',
              style: TextStyle(fontSize: 20, color: _dark ? Colors.white : Colors.black),
            ),
            const SizedBox(width: 12),
            Switch(
              value: _dark,
              onChanged: (bool value) {},
            ),
          ],
        ),
      ),
    );
  }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

让应用具有交互性中的所有课

自己练习: Flutter 在线编译器