{"id":559,"date":"2023-02-09T21:43:03","date_gmt":"2023-02-09T13:43:03","guid":{"rendered":"https:\/\/iichen.cn\/?p=559"},"modified":"2025-01-23T16:14:26","modified_gmt":"2025-01-23T08:14:26","slug":"flutter-%e5%8a%a8%e7%94%bb","status":"publish","type":"post","link":"https:\/\/iichen.cn\/?p=559","title":{"rendered":"Flutter-\u52a8\u753b"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><div class='fancybox-wrapper lazyload-container-unload' data-fancybox='post-images' href='https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png'><img class=\"lazyload lazyload-style-11\" src=\"data:image\/svg+xml;base64,PCEtLUFyZ29uTG9hZGluZy0tPgo8c3ZnIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjZmZmZmZmMDAiPjxnPjwvZz4KPC9zdmc+\"  decoding=\"async\" width=\"1024\" height=\"453\" data-original=\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB\/AAffA0nNPuCLAAAAAElFTkSuQmCC\" alt=\"\" class=\"wp-image-748\"  sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/div><\/figure>\n\n\n<p>\u00a0<\/p>\n<blockquote>\n<ol>\n<li>AnimatedSwitcher&gt;<\/li>\n<li>controller.drive(Tween(begin:xxx,end:xxx))<\/li>\n<li>Tween(begin:xxx,end:xxx).chain(CurveTween(curve: Curves.elasticInOut)).animate(controller)<\/li>\n<li>CurveTween(curve: Inteval(0.5,1.0)) \u52a8\u753b\u533a\u95f4\uff08\u8868\u793a\u4ece\u540e\u534a\u6bb5\u624d\u5f00\u59cb\u52a8\u753b\uff09<\/li>\n<\/ol>\n<\/blockquote>\n<pre><code class=\"language-dart line-numbers\">import 'package:flutter\/material.dart';\n\/\/ \u6838\u5fc3\uff1aTweenSequenceItem\u3001Transform\u3001Matrix\u3001\u7c7b\u63a5\u53e3\u56de\u8c03\nclass ShakeAnimatedWidget extends StatefulWidget {\n\n  double shake;\n  Widget child;\n  Alignment alignment;\n  ShakeAnimatedController? controller;\n  \/\/ \u52a8\u753b\u6267\u884c\u6b21\u6570  0 \u5219\u65e0\u9650\u5faa\u73af  \u9ed8\u8ba4 1\u6b21\n  int loopCount;\n  Duration? duration;\n  \/\/\u6446\u52a8\u5e45\u5ea6\n  double amplitude;\n\n  ShakeAnimatedWidget({\n    Key? key,\n    double shake = 1.0,\n    required Widget child,\n    Alignment alignment = Alignment.center,\n    ShakeAnimatedController? controller,\n    int loopCount = 1,\n    Duration? duration,\n    double amplitude = 15,\n  }): this.shake = shake,\n      this.child = child,\n      this.controller = controller,\n      this.alignment = alignment,\n      this.duration = duration,\n      this.loopCount = loopCount,\n      this.amplitude = amplitude,\n        super(key: key);\n\n  @override\n  ShakeAnimatedWidgetState createState() =&gt; new ShakeAnimatedWidgetState();\n}\n\nclass ShakeAnimatedWidgetState extends State&lt;ShakeAnimatedWidget&gt; with SingleTickerProviderStateMixin {\n  AnimationController? _controller;\n  Animation&lt;double&gt;? _animation;\n\n  @override\n  Widget build(BuildContext context) {\n    assert(_animation!=null);\n    return AnimatedBuilder(\n      animation: _animation!,\n      builder: (BuildContext context, Widget? child) {\n        return Transform(\n          transform: Matrix4.translationValues(_animation!.value * widget.amplitude, 0, 0),\n          alignment: widget.alignment,\n          child: widget.child\n        );\n      },\n    );\n  }\n\n  \/\/ \u7528\u4e8e\u8bb0\u5f55 \u52a8\u753b\u6267\u884c\u6b21\u6570\n  int nowExeAnimatedNum = 1;\n  @override\n  void initState() {\n    super.initState();\n    _controller = AnimationController(duration: widget.duration??Duration(milliseconds: 300),vsync: this);\n    _animation = TweenSequence&lt;double&gt;([\n      \/\/\/TweenSequenceItem\u6765\u7ec4\u5408\u5176\u4ed6\u7684Tween\n      TweenSequenceItem&lt;double&gt;(\n          tween: Tween(begin: 0, end: widget.shake), weight: 1),\n      TweenSequenceItem&lt;double&gt;(\n          tween: Tween(begin: widget.shake, end: 0), weight: 1),\n      TweenSequenceItem&lt;double&gt;(\n          tween: Tween(begin: 0, end: -widget.shake), weight: 1),\n      TweenSequenceItem&lt;double&gt;(\n          tween: Tween(begin: -widget.shake, end: 0), weight: 1),\n      TweenSequenceItem&lt;double&gt;(\n          tween: Tween(begin: 0, end: widget.shake), weight: 1),\n      TweenSequenceItem&lt;double&gt;(\n          tween: Tween(begin: widget.shake, end: 0), weight: 1),\n    ]).chain(CurveTween(curve: Curves.linear)).animate(_controller!);\n\n\n    _controller?.addStatusListener(handlerStatus);\n\n    widget.controller?.addShakeAnimatedListener(handleListener);\n  }\n\n  @override\n  void dispose() {\n    super.dispose();\n    _controller?.dispose();\n    _controller = null;\n    _animation = null;\n    widget.controller?.removeShakeAnimatedListener();\n  }\n\n  handlerStatus(status) {\n    \/\/ \u52a8\u753b\u6267\u884c \u4e00\u4e2a\u5faa\u73af \u5426\u5219 \u4e0d\u7528\u5904\u7406 \u4e0b\u9762\u7684 \u72b6\u6001\n    if(status == AnimationStatus.completed){\n      if(widget.loopCount == 0){\n        _controller?.forward();\n      }else{\n        if(nowExeAnimatedNum &lt; widget.loopCount){\n          _controller?.forward();\n          nowExeAnimatedNum ++;\n        }else{\n          widget.controller?.isAnimating = false;\n        }\n      }\n    }\n    \/\/ else if(status == AnimationStatus.dismissed){   \/\/\/ \u52a8\u753b\u7ed3\u675f \u505c\u7559\u5728 \u5f00\u59cb\u4f4d\u7f6e\n    \/\/\n    \/\/ }\n  }\n\n  void handleListener(bool start) {\n    nowExeAnimatedNum = 1;\n    if(start){\n      _controller?.reset();\n      _controller?.forward();\n    }else{\n      _controller?.stop();\n    }\n  }\n}\n\/\/ \u5f53\u7136\u53ef\u4ee5\u76f4\u63a5\u5c06 AnimatedController\u4f20\u8fc7\u6765 \u4f46\u662f\u9650\u5236\u5c31\u6bd4\u8f83\u5927 \u53ea\u80fd\u8c03\u7528 Controller\u4e00\u4e9b\u65b9\u6cd5 \u8fd8\u6709\u76d1\u542c\u5565\u7684\u3002\u6240\u4ee5\u5427\u8fd9\u4e9b\u5de5\u4f5c\u5168\u90e8 \u5230\u6e90\u7c7b  Function \u4f5c\u4e3a\u6865\u6881 ye\n\/\/ \u7c7b\u4f3c\u63a5\u53e3\u56de\u8c03 \u6709\u70b9\u610f\u601d\u554a\ntypedef ShakeAnimatedListener = void Function(bool start);\nclass ShakeAnimatedController{\n\n  ShakeAnimatedListener? listener;\n\n  bool isAnimating = false;\n\n  addShakeAnimatedListener(ShakeAnimatedListener listener){\n    this.listener = listener;\n  }\n\n  void forward(){\n    if(listener!=null){\n      isAnimating = true;\n      listener!(true);\n    }\n  }\n\n  void stop(){\n    if(listener!=null){\n      isAnimating = false;\n      listener!(false);\n    }\n  }\n\n  void removeShakeAnimatedListener(){\n    listener = null;\n  }\n}\n<\/code><\/pre>","protected":false},"excerpt":{"rendered":"<p>\u00a0 AnimatedSwitcher&gt; controller.drive(Tween(begin:xxx [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,8],"tags":[],"class_list":["post-559","post","type-post","status-publish","format-standard","hentry","category-flutter","category-8"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Flutter-\u52a8\u753b - IIchen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/iichen.cn\/?p=559\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flutter-\u52a8\u753b - IIchen\" \/>\n<meta property=\"og:description\" content=\"\u00a0 AnimatedSwitcher&gt; controller.drive(Tween(begin:xxx [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/iichen.cn\/?p=559\" \/>\n<meta property=\"og:site_name\" content=\"IIchen\" \/>\n<meta property=\"article:published_time\" content=\"2023-02-09T13:43:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-01-23T08:14:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png\" \/>\n<meta name=\"author\" content=\"iichen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"iichen\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/iichen.cn\/?p=559#article\",\"isPartOf\":{\"@id\":\"https:\/\/iichen.cn\/?p=559\"},\"author\":{\"name\":\"iichen\",\"@id\":\"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c\"},\"headline\":\"Flutter-\u52a8\u753b\",\"datePublished\":\"2023-02-09T13:43:03+00:00\",\"dateModified\":\"2025-01-23T08:14:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/iichen.cn\/?p=559\"},\"wordCount\":25,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c\"},\"image\":{\"@id\":\"https:\/\/iichen.cn\/?p=559#primaryimage\"},\"thumbnailUrl\":\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png\",\"articleSection\":[\"Flutter\",\"\u7b14\u8bb0\"],\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/iichen.cn\/?p=559#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/iichen.cn\/?p=559\",\"url\":\"https:\/\/iichen.cn\/?p=559\",\"name\":\"Flutter-\u52a8\u753b - IIchen\",\"isPartOf\":{\"@id\":\"https:\/\/iichen.cn\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/iichen.cn\/?p=559#primaryimage\"},\"image\":{\"@id\":\"https:\/\/iichen.cn\/?p=559#primaryimage\"},\"thumbnailUrl\":\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png\",\"datePublished\":\"2023-02-09T13:43:03+00:00\",\"dateModified\":\"2025-01-23T08:14:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/iichen.cn\/?p=559#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/iichen.cn\/?p=559\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/iichen.cn\/?p=559#primaryimage\",\"url\":\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator.png\",\"contentUrl\":\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator.png\",\"width\":1063,\"height\":470},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/iichen.cn\/?p=559#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/iichen.cn\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flutter-\u52a8\u753b\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/iichen.cn\/#website\",\"url\":\"https:\/\/iichen.cn\/\",\"name\":\"IIchen\",\"description\":\"Just do it!\",\"publisher\":{\"@id\":\"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/iichen.cn\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c\",\"name\":\"iichen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/iichen.cn\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/avatar.jpg\",\"contentUrl\":\"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/avatar.jpg\",\"width\":940,\"height\":940,\"caption\":\"iichen\"},\"logo\":{\"@id\":\"https:\/\/iichen.cn\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/www.iichen.cn\"],\"url\":\"https:\/\/iichen.cn\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flutter-\u52a8\u753b - IIchen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/iichen.cn\/?p=559","og_locale":"zh_CN","og_type":"article","og_title":"Flutter-\u52a8\u753b - IIchen","og_description":"\u00a0 AnimatedSwitcher&gt; controller.drive(Tween(begin:xxx [&hellip;]","og_url":"https:\/\/iichen.cn\/?p=559","og_site_name":"IIchen","article_published_time":"2023-02-09T13:43:03+00:00","article_modified_time":"2025-01-23T08:14:26+00:00","og_image":[{"url":"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png","type":"","width":"","height":""}],"author":"iichen","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"iichen","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"2 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/iichen.cn\/?p=559#article","isPartOf":{"@id":"https:\/\/iichen.cn\/?p=559"},"author":{"name":"iichen","@id":"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c"},"headline":"Flutter-\u52a8\u753b","datePublished":"2023-02-09T13:43:03+00:00","dateModified":"2025-01-23T08:14:26+00:00","mainEntityOfPage":{"@id":"https:\/\/iichen.cn\/?p=559"},"wordCount":25,"commentCount":0,"publisher":{"@id":"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c"},"image":{"@id":"https:\/\/iichen.cn\/?p=559#primaryimage"},"thumbnailUrl":"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png","articleSection":["Flutter","\u7b14\u8bb0"],"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/iichen.cn\/?p=559#respond"]}]},{"@type":"WebPage","@id":"https:\/\/iichen.cn\/?p=559","url":"https:\/\/iichen.cn\/?p=559","name":"Flutter-\u52a8\u753b - IIchen","isPartOf":{"@id":"https:\/\/iichen.cn\/#website"},"primaryImageOfPage":{"@id":"https:\/\/iichen.cn\/?p=559#primaryimage"},"image":{"@id":"https:\/\/iichen.cn\/?p=559#primaryimage"},"thumbnailUrl":"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator-1024x453.png","datePublished":"2023-02-09T13:43:03+00:00","dateModified":"2025-01-23T08:14:26+00:00","breadcrumb":{"@id":"https:\/\/iichen.cn\/?p=559#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/iichen.cn\/?p=559"]}]},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/iichen.cn\/?p=559#primaryimage","url":"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator.png","contentUrl":"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/flutter_animator.png","width":1063,"height":470},{"@type":"BreadcrumbList","@id":"https:\/\/iichen.cn\/?p=559#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/iichen.cn\/"},{"@type":"ListItem","position":2,"name":"Flutter-\u52a8\u753b"}]},{"@type":"WebSite","@id":"https:\/\/iichen.cn\/#website","url":"https:\/\/iichen.cn\/","name":"IIchen","description":"Just do it!","publisher":{"@id":"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/iichen.cn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":["Person","Organization"],"@id":"https:\/\/iichen.cn\/#\/schema\/person\/4a47edf85ab49841df9e8f6aee40b77c","name":"iichen","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/iichen.cn\/#\/schema\/person\/image\/","url":"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/avatar.jpg","contentUrl":"https:\/\/iichen.cn\/wp-content\/uploads\/2025\/01\/avatar.jpg","width":940,"height":940,"caption":"iichen"},"logo":{"@id":"https:\/\/iichen.cn\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/www.iichen.cn"],"url":"https:\/\/iichen.cn\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/iichen.cn\/index.php?rest_route=\/wp\/v2\/posts\/559","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/iichen.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/iichen.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/iichen.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/iichen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=559"}],"version-history":[{"count":2,"href":"https:\/\/iichen.cn\/index.php?rest_route=\/wp\/v2\/posts\/559\/revisions"}],"predecessor-version":[{"id":760,"href":"https:\/\/iichen.cn\/index.php?rest_route=\/wp\/v2\/posts\/559\/revisions\/760"}],"wp:attachment":[{"href":"https:\/\/iichen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=559"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/iichen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=559"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/iichen.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=559"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}