Dart4Flutter - 01 – 變量、類型和函數react
Dart4Flutter – 03 – 類和泛型github
Dart4Flutter - 拾遺01 - flutter-dart環境搭建app
Flutter入門 - 狀態管理less
Flutter 入門 - Container 屬性詳解ide
Flutter 入門-本地訪問-MethodChannel函數
Flutter 實例 - 從本地到Flutter通訊 - Event Channels
flutter是一個新的跨平臺框架,使用Dart語言開發。轉移到新的平臺,其中有一個問題:狀態管理。
由於咱們要演示在不一樣的界面跳轉,因此如今咱們建立兩個文件MyHomePage.dart
和MySecondPage.dart
.
咱們例子具體以下:
看起來彷佛很簡單,可是咱們要找到一個方法,可使counter在兩個界面之間同步。
假設如今counter=0;當咱們在MyHomePage將counter增長到2,而後跳轉到MySecondPage界面,顯示的counter也必須是2.
同時,假設咱們在MySecondPage界面遞減兩次counter,這時當用戶跳轉到MyHomePage,counter也應該是0。
這就是狀態管理。
假設您已經知道setState()
機制,用來更新UI的機制。如今咱們看看具體怎麼作。
main.dart 以下:
import 'package:flutter/material.dart';
import 'package:flutter_redux_example/screens/MyHomePage.dart';
void main() => runApp(new MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => new _MyAppState();
}
class _MyAppState extends State<MyApp> {
int counter;
@override
void initState() {
super.initState();
counter = counter ?? 0;
}
void _decrementCounter(_) {
setState(() {
counter--;
print('decrement: $counter');
});
}
void _incrementCounter(_) {
setState(() {
counter++;
print('increment: $counter');
});
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home: new MyHomePage(
title: 'My Home Page',
counter: counter,
decrementCounter: _decrementCounter,
incrementCounter: _incrementCounter,
),
);
}
}
複製代碼
如上所示, _decrementCounter() 和 _incrementCounter()分別是遞增和遞減counter的方法,咱們將他們當作MyHomePage的構造函數。
MyHomePage.dart 以下:
import 'package:flutter/material.dart';
import 'package:flutter_redux_example/screens/MySecondPage.dart';
class MyHomePage extends StatefulWidget {
MyHomePage({
Key key,
this.title,
this.counter,
this.decrementCounter,
this.incrementCounter
}) : super(key: key);
final String title;
final int counter;
final ValueChanged<void> decrementCounter;
final ValueChanged<void> incrementCounter;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void _onPressed() {
widget.incrementCounter(null);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text('You have pushed the button this many times:'),
new Text(
widget.counter.toString(),
style: Theme.of(context).textTheme.display1,
),
new RaisedButton(
child: new Text('Next Screen'),
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => new MySecondPage(
widget.decrementCounter,
title: 'My Second Page',
counter: widget.counter,
),
),
);
},
)
],
),
),
floatingActionButton: new FloatingActionButton(
onPressed: _onPressed,
tooltip: 'Increment',
child: new Icon(Icons.add),
),
);
}
}
複製代碼
如上所示,咱們將decrementCounter()做爲MySecondPage構造函數的參數,向下傳遞。
MySecondPage.dart 文件以下所示:
import 'package:flutter/material.dart';
class MySecondPage extends StatefulWidget {
MySecondPage(
this.decrementCounter,
{Key key, this.title, this.counter}
): super(key: key);
final String title;
final int counter;
final ValueChanged<void> decrementCounter;
@override
_MySecondPageState createState() => new _MySecondPageState();
}
class _MySecondPageState extends State<MySecondPage> {
void onPressed() {
widget.decrementCounter(null);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),
),
body: new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text('You have pushed the button this many times :'),
new Text(
super.widget.counter.toString(),
style: Theme.of(context).textTheme.display1,
),
],
),
),
floatingActionButton: new FloatingActionButton(
onPressed: onPressed,
tooltip: 'Decrement',
child: new Icon(Icons.indeterminate_check_box),
backgroundColor: Colors.red),
);
}
}
複製代碼
若是您瞭解react,上面的內容比較容易理解。
flutter中的StatefulWidget
和StatelessWidget
對應react中的Component
和 PureComponent
。flutter中稱爲Widget
的,react稱爲Component