Flutter是跨平台的
UI框架,主要解决的就是界面的跨平台。
一切显示都是
widget,widget是所有控件的基础。
Flutter每个页面都是一帧。
无状态控件(StatelessWidget)
控件保持在这一帧。 继承StatelessWidget,在buiold方法内返回一个嵌套好的布局渲染。
有状态控件(StatefulWidget)
控件数据更新,构建新的widget。
State 实现了数据的跨帧保存和恢复。 **setState({})**方法触发界面更新 **{}**中就是要改变的数据 示例可以参考新建Flutter项目默认的计时器项目,截取了部分代码如下:
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
控件State生命周期
常用控件
Flutter中有30多种内置的控件和布局,而且很多控件的职责其实非常单一。
container
container是最常用的布局,是由其他好几个默认的widget组成的模板。 支持padding,margin,color,width,height等属性。
Padding
用来设置padding的控件。职责非常单一。 同类的还有Center(设置居中),Align等(可参考后续配图)。
Column和Row
最常见的横竖布局。
常用控件
分类图待补充
页面
除了上面描述的常用的控件之外,Flutter还有用于交互显示的Widget。如MaterialApp(App顶层主页入口),Scaffold(用于承载一般用户界面,脚手架),Appbar,Text,Image等。
路由跳转(Navigator)
命名路由跳转
通过MaterialApp的routes参数配置路由表
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
routes: {
"home":(context){
return HomePage();
}
},
);
}
}
Navigator.pushNamed(context, "/home");
Navigator.pushNamed(context, "/home", arguments: <String, String>{
"date":"20220504",
},);
Navigator.pushReplacementNamed(context, "/home");
Navigator.pushNamedAndRemoveUntil(context, "/home",ModalRoute.withName("/"));
直接使用Route跳转
需要手动构建Route参数信息,然后交给Navigator实现调整
Navigator.push(context, MaterialPageRoute(builder: (context) => NotifyPage()));
使用onGenerateRoute跳转
利用onGenerateRoute方法在MateriaApp中增加特殊定制处理的路由跳转。
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
onGenerateRoute: (RouteSettings settings){
WidgetBuilder builder;
switch(settings.name){
case "signup/personal_info":
builder = (BuildContext _) => CollectPersonalInfoPage();
break;
case "signup/choose_credentials":
builder = (BuildContext _) => ChooseCredentialsPage();
return CupertinoPageRoute(builder: builder,settings: settings);
default:
throw Exception("invalid route");
}
return MaterialPageRoute(builder: builder,settings: settings);
},
);
}
}
|