こちらのサイトのコードを見ながらDart/Flutterの勉強をしております。
ご質問
_click() async {//here
の箇所を見て、あーここで非同期の制御をしているんだなと考え、ここでasyncを除外すれば、FABをタップで動作中に再度タップしても処理が完了するまで次の動きを待ってくれるのかと想像しました。
しかしながら、実際にはasyncを除き _click() {}
としても特に結果として、動作は中断され、新たなanimation(flagの反転処理)が実行され、この除外をもって、同期/非同期の動作に違いがあるように思えません。
動作が完了して同期的に処理するという点でasync
の当該コードから取り除くアプローチが間違っているのでしょうか?そもそも間違いであるとしたら、ここでasync
があるないで動作に違いがないように思えるのですが、ここの非同期async
の指定には何の意味があるのでしょうか?
宜しくお願い申し上げます。
※当方、DartPadで上記の動作を確認しております。
Dart
1import 'package:flutter/material.dart'; 2 3void main() { 4 runApp(MyApp()); 5} 6 7class MyApp extends StatelessWidget { 8 9 Widget build(BuildContext context) { 10 return MaterialApp( 11 title: 'Flutter Demo', 12 theme: ThemeData( 13 primarySwatch: Colors.blue, 14 ), 15 home: MyHomePage(title: 'Flutter Demo Home Page'), 16 ); 17 } 18} 19 20class MyHomePage extends StatefulWidget { 21 MyHomePage({Key? key, this.title}) : super(key: key); 22 final String? title; 23 24 _MyHomePageState createState() => _MyHomePageState(); 25} 26 27class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin { 28 bool flag = false; 29 30 _click() async {//here 31 setState(() { 32 flag = !flag; 33 }); 34 } 35 36 37 Widget build(BuildContext context) { 38 return Scaffold( 39 appBar: AppBar( 40 title: Text(widget.title!), 41 ), 42 body: Center( 43 child: Column( 44 mainAxisAlignment: MainAxisAlignment.center, 45 children: <Widget>[ 46 AnimatedOpacity( 47 opacity: flag ? 0.1 : 1.0, 48 duration: Duration(seconds: 3), 49 child: Text( 50 "消える文字", 51 style: Theme.of(context).textTheme.headline4, 52 )), 53 AnimatedSize( 54 vsync: this, 55 duration: Duration(seconds: 3), 56 child: SizedBox( 57 width: flag ? 50 : 200, 58 height: flag ? 50 : 200, 59 child: Container(color: Colors.purple))), 60 AnimatedAlign( 61 duration: Duration(seconds: 3), 62 alignment: flag ? Alignment.topLeft : Alignment.bottomRight, 63 child: SizedBox( 64 width: 50, 65 height: 50, 66 child: Container(color: Colors.green))) 67 ], 68 ), 69 ), 70 floatingActionButton: 71 Row(mainAxisAlignment: MainAxisAlignment.end, children: [ 72 FloatingActionButton(onPressed: _click, child: Icon(Icons.add)), 73 ]), 74 ); 75 } 76}
回答1件
あなたの回答
tips
プレビュー