1、对应关系
|
Android |
Flutter |
页面 |
Activity和Fragment |
Widget |
视图 |
View |
Widget |
页面跳转 |
Intent |
Navigater |
网络库 |
okHttp |
http |
数据存储 |
SharedPreference和SQLite |
shared_preferences和sqflite |
|
Android |
Flutter |
布局文件 |
xml |
Widget |
线性布局 |
LinearLayout |
Row和Column widget |
相对布局 |
RelativeLayout |
组合使用Column、Row和Stack Widget |
文本框 |
TextView |
text |
输入框 |
EditText |
TextField |
|
Android |
Flutter |
布局文件 |
xml |
Widget |
滚动视图 |
ScrollView |
ListView |
列表 |
ListView |
ListView |
列表 |
RecyclerView |
ListView.builder |
2、快速上手布局开发
dart
复制代码
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(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String tips = "";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Text(tips),
),
floatingActionButton: FloatingActionButton(
onPressed: _updateTips,
tooltip: 'Update',
child: const Icon(Icons.add),
),
);
}
//更新布局 widgets
//类似android中 setText
void _updateTips() {
//我们无法改变widget,因为 Flutter 中 widget 是不可变的
//但是可以通过 setState 改变 widget状态
setState(() {
tips = "快速上手 Flutter";
});
}
}
- 在body中添加一个Text,其取值为 tips
- 按钮的点击事件 _updateTips() 中,通过 setState() 改变 tips 的值,从而更新 widget 状态
该示例类似于 android 中的 textView.setText(tips)
dart
复制代码
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(
title: 'muke flutter',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: const MyHomePage(title: 'muke learning'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _toggle = true;
get _dyWidget => _toggle ? const Text("Widget 1") : const Text("Widget 2");
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: _dyWidget,
),
floatingActionButton: FloatingActionButton(
onPressed: _updateWidget,
tooltip: 'Update',
child: const Icon(Icons.add),
),
);
}
//在布局中添加/删除一个 widget
//类似安卓中 addView、removeView
void _updateWidget() {
setState(() {
_toggle = !_toggle;
});
}
}
- body中添加一个 Text,这个 Text 会根据 _toggle 的值变换,Text("Widget 1")或Text("Widget 2")
- 按钮点击事件 _updateWidget() 通过 setState() 更改 _toggle 的值,从而实现更换 widget 效果
dart
复制代码
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(
title: 'muke flutter',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: const MyHomePage(title: 'muke learning'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: const Center(
child: TipsWidget(),
),
);
}
}
//自定义 Widget
class TipsWidget extends StatelessWidget {
const TipsWidget({super.key});
@override
Widget build(BuildContext context) {
return const Text("自定义 Widget");
}
}
- 自定义 TipsWidget,然后添加至 body 中
(4)添加一个滚动列表
dart
复制代码
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(
title: 'muke flutter',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: const MyHomePage(title: 'muke learning'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
get _listView => ListView(
children: const [
Text("AAA"),
Text("BBB"),
Text("CCC"),
Text("DDD"),
Text(
"EEE",
style: TextStyle(fontSize: 230),
)
],
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: _listView,
),
);
}
}
3、手势事件处理
dart
复制代码
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(
title: 'muke flutter',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: const MyHomePage(title: 'muke learning'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: ElevatedButton(
child: Text("click me : $_count"),
onPressed: () {
setState(() {
_count++;
});
},
),
),
);
}
}
(2)GestureDetector手势监听
dart
复制代码
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(
title: 'muke flutter',
theme: ThemeData(
primarySwatch: Colors.red,
),
home: const MyHomePage(title: 'muke learning'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: GestureDetector(
child: Text("click me : $_count"),
onTap: () {
setState(() {
_count++;
});
},
onLongPress: () {
setState(() {
_count = 0;
});
},
),
),
);
}
}
- GestureDetetor 只是对 Text 添加了一个手势监听,没有按钮样式
- onTap():单机时,加一
- onLongPress():长按时,清零
4、进阶
(1)异步 UI
(2)页面跳转
(3)工程结构和资源文件
(4)网络请求
(5)数据存储