Future<String> fetchData2(String input) async {
await Future.delayed(const Duration(seconds: 5));
return 'Hello, $input!';
}
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 index = 0;
StreamController<int> _counterController = StreamController<int>();
int _counter = 0;
void _incrementCounter() {
if (index == 0) {
index = 1;
} else {
index = 0;
}
_counter++;
_counterController.sink.add(_counter);
setState(() {});
}
@override
void dispose() {
_counterController.close();
super.dispose();
}
Future<String> fetchData() async {
return Future.delayed(const Duration(seconds: 3), () => 'Hello, world!');
}
Future<List<String>> fetchData3() async {
List<Future<String>> futures = [
Future.delayed(const Duration(seconds: 1), () => 'Hello'),
Future.delayed(const Duration(seconds: 2), () => 'World!!!'),
];
List<String> results = await Future.wait(futures);
return results;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
children: [
IndexedStackWidget(
index: index,
),
// 異步
FutureBuilder(
future: fetchData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Text(snapshot.data ?? '');
} else {
return const CircularProgressIndicator();
}
},
),
// isolate獲取數(shù)據(jù)
FutureBuilder(
future: compute(fetchData2, 'world'),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
return Text(snapshot.data ?? '');
} else {
return const CircularProgressIndicator();
}
},
),
// stream 流顯示
StreamBuilder<int>(
stream: _counterController.stream,
builder: (context, snapshot) {
if (snapshot.hasData) {
return Text('Counter: ${snapshot.data}');
} else {
return const CircularProgressIndicator();
}
},
),
/// 多異步操作
FutureBuilder(
future: fetchData3(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasData) {
return Text(snapshot.data?.join(' ') ?? '');
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return const Text('No data');
}
} else {
return const CircularProgressIndicator();
}
},
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
);
}
}
class FlexDemo extends StatelessWidget {
const FlexDemo({super.key});
@override
Widget build(BuildContext context) {
return Flex(
direction: Axis.horizontal,
children: [
Expanded(
child: Container(
height: 100,
color: Colors.red,
),
),
Expanded(
child: Container(
height: 100,
color: Colors.blue,
),
),
],
);
}
}
class MyLayoutDelegate extends MultiChildLayoutDelegate {
MyLayoutDelegate({this.position});
final Offset? position;
@override
void performLayout(Size size) {
// `size` is the size of the `CustomMultiChildLayout` itself.
Size leadingSize = Size
.zero; // If there is no widget with id `1`, the size will remain at zero.
// Remember that `1` here can be any **id** - you specify them using LayoutId.
if (hasChild(1)) {
leadingSize = layoutChild(
1, // The id once again.
BoxConstraints.tightFor(
height: size
.height), // This just says that the child cannot be bigger than the whole layout.
);
// No need to position this child if we want to have it at Offset(0, 0).
}
if (hasChild(2)) {
final secondSize = layoutChild(
2,
BoxConstraints.tightFor(width: size.width / 2),
);
positionChild(
2,
Offset(
leadingSize.width, // This will place child 2 to the right of child 1.
size.height / 2 -
secondSize.height / 2, // Centers the second child vertically.
),
);
}
}
@override
bool shouldRelayout(MyLayoutDelegate oldDelegate) =>
oldDelegate.position != position;
}
class MultiChild extends StatelessWidget {
const MultiChild({super.key});
@override
Widget build(BuildContext context) {
return CustomMultiChildLayout(
delegate: MyLayoutDelegate(),
children: [
LayoutId(
id: 1, // The id can be anything, i.e. any Object, also an enum value.
child: const Text(
'Widget one'), // This is the widget you actually want to show.
),
LayoutId(
id: 2, // You will need to refer to that id when laying out your children.
child: const Card(
child: Padding(
padding: EdgeInsets.all(8.0),
child: Text('Widget two'),
),
),
),
],
);
}
}
class IndexedStackWidget extends StatelessWidget {
final int index;
const IndexedStackWidget({super.key, required this.index});
@override
Widget build(BuildContext context) {
return IndexedStack(
index: index,
children: [
Container(
width: 100,
height: 100,
color: Colors.red,
),
Container(
width: 100,
height: 100,
color: Colors.blue,
),
],
);
}
}
性能優(yōu)化demo
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贴硫,“玉大人椿每,你說(shuō)我怎么就攤上這事伊者。” “怎么了间护?”我有些...
- 文/不壞的土叔 我叫張陵亦渗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汁尺,道長(zhǎng)法精,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任痴突,我火速辦了婚禮搂蜓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辽装。我一直安慰自己帮碰,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布如迟。 她就那樣靜靜地躺著,像睡著了一般攻走。 火紅的嫁衣襯著肌膚如雪殷勘。 梳的紋絲不亂的頭發(fā)上,一...
- 那天昔搂,我揣著相機(jī)與錄音玲销,去河邊找鬼。 笑死摘符,一個(gè)胖子當(dāng)著我的面吹牛贤斜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逛裤,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼瘩绒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了带族?” 一聲冷哼從身側(cè)響起锁荔,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝙砌,沒(méi)想到半個(gè)月后阳堕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡择克,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年恬总,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肚邢。...
- 正文 年R本政府宣布,位于F島的核電站并巍,受9級(jí)特大地震影響目木,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜懊渡,卻給世界環(huán)境...
- 文/蒙蒙 一刽射、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剃执,春花似錦誓禁、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至怒见,卻和暖如春俗慈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遣耍。 一陣腳步聲響...
- 正文 我出身青樓酣溃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親纪隙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赊豌,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 我們都知道iOS開(kāi)發(fā)時(shí)UITabelView是使用頻率非常高的一個(gè)控件,圍繞它的性能優(yōu)化也有很多方法绵咱,這里先介紹其...
- 一麸拄、普通寫(xiě)法的朋友圈 為了做對(duì)比派昧,這里我用普通方法編寫(xiě)了朋友圈(PS:這里朋友圈是比較簡(jiǎn)陋的哈,但可以反映問(wèn)題)拢切。...
- 項(xiàng)目上線之后泻拦,以為可以放松一段時(shí)間毙芜,結(jié)果又被老板叫回去連夜加班,優(yōu)化性能争拐,提高系統(tǒng)在線并發(fā)數(shù)腋粥。滿腦子一頭霧水,不知...
- Android性能優(yōu)化包括啟動(dòng)速度優(yōu)化、布局優(yōu)化绑雄、內(nèi)存優(yōu)化展辞、耗電優(yōu)化、apk大小優(yōu)化等內(nèi)容万牺,這些方面有著一個(gè)持續(xù)性...
- 引言 1. Android性能優(yōu)化篇之內(nèi)存優(yōu)化--內(nèi)存泄漏 2.Android性能優(yōu)化篇之內(nèi)存優(yōu)化--內(nèi)存優(yōu)化分析...