快速上手 Flutter 的高效路径
一、环境搭建与第一个项目
二、核心概念与最小示例
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,
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const CounterPage(),
);
}
}
class CounterPage extends StatefulWidget {
const CounterPage({super.key});
@override
State<CounterPage> createState() => _CounterPageState();
}
class _CounterPageState extends State<CounterPage> {
int _count = 0;
void _increment() => setState(() => _count++);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Counter')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('$_count', style: const TextStyle(fontSize: 32)),
ElevatedButton(onPressed: _increment, child: const Text('+1')),
],
),
),
);
}
}
三、实战项目 Todo 列表(含状态管理)
lib/
main.dart
models/task.dart
providers/task_provider.dart
screens/home_screen.dart
screens/add_task_screen.dart
widgets/task_item.dart
class Task {
final String id;
final String title;
bool isCompleted;
Task({required this.id, required this.title, this.isCompleted = false});
}
import 'package:flutter/foundation.dart';
import '../models/task.dart';
class TaskProvider with ChangeNotifier {
final List<Task> _tasks = [];
List<Task> get tasks => [..._tasks];
void addTask(String title) {
if (title.trim().isNotEmpty) {
_tasks.add(Task(id: DateTime.now().toString(), title: title));
notifyListeners();
}
}
void toggleTask(String id) {
final task = _tasks.firstWhere((t) => t.id == id);
task.isCompleted = !task.isCompleted;
notifyListeners();
}
}
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'providers/task_provider.dart';
import 'screens/home_screen.dart';
void main() => runApp(
ChangeNotifierProvider(
create: (_) => TaskProvider(),
child: const MyApp(),
),
);
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Todo App',
theme: ThemeData(primarySwatch: Colors.green),
home: const HomeScreen(),
);
}
}
// home_screen.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/task_provider.dart';
import '../widgets/task_item.dart';
import 'add_task_screen.dart';
class HomeScreen extends StatelessWidget {
const HomeScreen({super.key});
@override
Widget build(BuildContext context) {
final provider = context.watch<TaskProvider>();
return Scaffold(
appBar: AppBar(title: const Text('待办事项')),
body: ListView.builder(
itemCount: provider.tasks.length,
itemBuilder: (_, i) => TaskItem(task: provider.tasks[i]),
),
floatingActionButton: FloatingActionButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(builder: (_) => const AddTaskScreen()),
),
child: const Icon(Icons.add),
),
);
}
}
// widgets/task_item.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../models/task.dart';
import '../providers/task_provider.dart';
class TaskItem extends StatelessWidget {
final Task task;
const TaskItem({super.key, required this.task});
@override
Widget build(BuildContext context) {
final provider = context.read<TaskProvider>();
return ListTile(
title: Text(task.title, style: TextStyle(decoration: task.isCompleted ? TextDecoration.lineThrough : null)),
trailing: Checkbox(
value: task.isCompleted,
onChanged: (_) => provider.toggleTask(task.id),
),
);
}
}
import 'package:flutter/material.dart';
class AddTaskScreen extends StatefulWidget {
const AddTaskScreen({super.key});
@override
State<AddTaskScreen> createState() => _AddTaskScreenState();
}
class _AddTaskScreenState extends State<AddTaskScreen> {
final _controller = TextEditingController();
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void _submit() {
final title = _controller.text.trim();
if (title.isNotEmpty) {
Navigator.pop(context, title);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('新增任务')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
TextField(
controller: _controller,
autofocus: true,
decoration: const InputDecoration(labelText: '任务标题'),
onSubmitted: (_) => _submit(),
),
const SizedBox(height: 16),
ElevatedButton(onPressed: _submit, child: const Text('保存')),
],
),
),
);
}
}
final result = await Navigator.push<String>(
context,
MaterialPageRoute(builder: (_) => const AddTaskScreen()),
);
if (result != null && result.isNotEmpty) {
context.read<TaskProvider>().addTask(result);
}
dependencies:
flutter:
sdk: flutter
provider: ^6.1.1
然后运行 flutter pub get。四、调试与性能优化要点
五、学习路径与常用资源
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。