±à¼ÍƼö: |
±¾ÎÄÖØµã½éÉÜÁËÓû§ÐÐΪÂñµã¶¨ÒåÒÔ¼°ÊµÏÖ·½°¸Ïà¹ØÁ÷³Ì£¬Ï£Íû¶Ô´ó¼ÒÓаïÖú¡£
±¾ÎÄÀ´×ÔÓÚ°¢ÀïÔÆ£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
±³¾°
Óû§ÐÐΪÂñµãÊÇÓÃÀ´¼Ç¼Óû§ÔÚ²Ù×÷ʱµÄһϵÁÐÐÐΪ£¬Ò²ÊÇÒµÎñ×öÅжϵĺËÐÄÊý¾ÝÒÀ¾Ý£¬Èç¹ûȱʧ»òÕß²»×¼È·½«»á¸øÒµÎñ´øÀ´²»¿É»Ö¸´µÄËðʧ¡£ÏÐÓ㽫ҵÎñ´úÂë´ÓNativeÇ¨ÒÆµ½FlutterÉϹý³ÌÖУ¬·¢ÏÖÔÏÈNativeÌåϵÉϵÄÂñµã·½°¸ÎÞ·¨Ó¦ÓÃÔÚFlutterÌåϵ֮ÉÏ¡£¶øÈç¹ûÎÒÃÇÖ»°ÑÒµÎñ¹¦ÄÜÇ¨ÒÆ¹ýÀ´¾ÍÉÏÏߣ¬¶ÔÒµÎñÊǼ«Æä²»¸ºÔðÈεġ£Òò´Ë£¬¾¹ý²»¶Ï̽Ë÷£¬ÎÒÃdzÁµíÁËÒ»Ì×FlutterÉϵĸß׼ȷÂʵÄÓû§ÐÐΪÂñµã·½°¸¡£
Óû§ÐÐΪÂñµã¶¨Òå
ÏÈÀ´½²½²ÔÚÎÒÃÇÕâÀïÊÇÈçºÎ¶¨ÒåÓû§ÐÐΪÂñµãµÄ¡£ÔÚÈçÏÂÓû§Ê±¼äÖáÉÏ£¬Óû§½øÈëAÒ³Ãæºó£¬¿´µ½Á˰´Å¥X£¬È»ºóµã»÷ÁËÕâ¸ö°´Å¥£¬Ëæ¼´´ò¿ªÁËеÄÒ³ÃæB¡£

Õâ¸öʱ¼äÖáÉÏÓÐÈçÏÂ5¸öÂñµãʼþ·¢Éú£º
½øÈëAÒ³Ãæ¡£AÒ³ÃæÊ×Ö¡äÖȾÍê±Ï£¬²¢»ñµÃÁ˽¹µã¡£
ÆØ¹â¿ÓλX¡£°´Å¥X´¦ÓÚÊÖ»úÆÁÄ»ÄÚ£¬ÇÒÍ£ÁôÒ»¶Îʱ¼ä£¬ÈÃÓû§¿É¼û¿É´¥Ãþ¡£
µã»÷¿ÓλX¡£Óû§¶Ô°´Å¥XµÄÄÚÈݺܸÐÐËȤ£¬ÓÚÊǵã»÷ÁËËü¡£°´Å¥XÏìÓ¦µã»÷£¬È»ºóÐèÒª´ò¿ªÒ»¸öÐÂÒ³Ãæ¡£
À뿪AÒ³Ãæ¡£AÒ³ÃæÊ§È¥½¹µã¡£
½øÈëBÒ³Ãæ¡£BÒ³ÃæÊ×Ö¡äÖȾÍê±Ï£¬²¢»ñµÃ½¹µã¡£
ÔÚÕâÀ´òÂñµã×îÖØÒªµÄÊÇʱ»ú£¬¼´ÔÚʲôʱ»úϵÄʼþÖд¥·¢Ê²Ã´Âñµã£¬ÏÂÃæÀ´¿´¿´ÏÐÓãÔÚFlutterÉϵÄʵÏÖ·½°¸¡£
ʵÏÖ·½°¸
½øÈë/Àë¿ªÒ³Ãæ
ÔÚNativeÔÉú¿ª·¢ÖУ¬Android¶ËÊǼàÌýActivityµÄonResumeºÍonPauseʼþÀ´×öÎªÒ³ÃæµÄ½øÈëºÍÀ뿪ʼþ£¬Í¬ÀíiOS¶ËÊǼàÌýUIViewControllerµÄviewWillAppearºÍviewDidDisappearʼþÀ´×öÎªÒ³ÃæµÄ½øÈëºÍÀ뿪ʼþ¡£Í¬Ê±Õû¸öÒ³ÃæÕ»ÊÇÓÉAndroidºÍiOS²Ù×÷ϵͳÀ´Î¬»¤¡£
ÔÚFlutterÖУ¬AndroidºÍiOS¶Ë·Ö±ðÊÇÓÃFlutterActivityºÍFlutterViewControllerÀ´×öΪÈÝÆ÷³ÐÔØFlutterµÄÒ³Ãæ£¬Í¨¹ýÕâ¸öÈÝÆ÷¿ÉÒÔÔÚÒ»¸öNativeµÄÒ³ÃæÄÚ£¨FlutterActivity/FlutterViewController£©À´½øÐÐFlutterÔÉúÒ³ÃæµÄÇл»¡£¼´ÔÚFlutter×Ô¼ºÎ¬»¤ÁËÒ»¸öFlutterÒ³ÃæµÄÒ³ÃæÕ»¡£ÕâÑù£¬ÔÀ´ÎÒÃÇ×îÊìϤµÄÄÇÌ×ÔÚNativeÔÉúÉÏ·½°¸ÔÚFlutterÉÏÎÞ·¨Ö±½ÓÔË×÷ÆðÀ´¡£
Õë¶ÔÕâ¸öÎÊÌ⣬¿ÉÄܺܶàÈË»áÏ뵽ȥע²á¼àÌýFlutterµÄNavigatorObserver£¬ÕâÑù¾ÍÖªµÀFlutterÒ³ÃæµÄ½øÕ»£¨push£©ºÍ³öÕ»£¨pop£©Ê¼þ¡£µ«ÊÇÕâ»áÓÐÁ½¸öÎÊÌ⣺
¼ÙÉèA¡¢BÁ½¸öÒ³ÃæÏȺó½øÕ»£¨A enter -> A leave -> B enter£©¡£È»ºóBÒ³Ãæ·µ»ØÍ˳ö£¨B
leave£©£¬´ËʱAÒ³ÃæÖØÐ¿ɼû£¬µ«ÊÇ´ËʱÊÇÊÕ²»µ½AÒ³Ãæpush£¨A enter£©µÄʼþ¡£
¼ÙÉèÔÚAÒ³Ãæµ¯³öÒ»¸öDialog»òÕßBottomSheet£¬¶øÕâÁ½ÀàÒ²»á×ßpush²Ù×÷£¬µ«Êµ¼ÊÉÏAÒ³Ãæ²¢Î´À뿪¡£
ºÃÔÚFlutterµÄÒ³ÃæÕ»²»ÏñAndroid NativeµÄÒ³ÃæÕ»ÄÇô¸´ÔÓ£¬ËùÒÔÕë¶ÔµÚÒ»¸öÎÊÌ⣬ÎÒÃÇ¿ÉÒÔÀ´Î¬»¤Ò»¸öºÍÒ³ÃæÕ»Æ¥ÅäµÄË÷ÒýÁÐ±í¡£µ±ÊÕµ½AÒ³ÃæµÄpushʼþʱ£¬Íù¶ÓÁÐÀïÈûÒ»¸öAµÄË÷Òý¡£µ±ÊÕµ½BÒ³ÃæµÄpushʼþʱ£¬¼ì²âÁбíÄÚÊÇ·ñÓÐÒ³Ãæ£¬ÈçÓУ¬Ôò¶ÔÁбí×îºóÒ»¸öÒ³ÃæÖ´ÐÐÀë¿ªÒ³ÃæÊ¼þ¼Ç¼£¬È»ºóÔÙ¶ÔBÒ³ÃæÖ´ÐнøÈëÒ³ÃæÊ¼þ¼Ç¼£¬½Ó×ÅÍù¶ÓÁÐÀïÈûÒ»¸öBµÄË÷Òý¡£µ±ÊÕµ½BÒ³ÃæµÄpopʼþʱ£¬ÏȶÔBÒ³ÃæÖ´ÐÐÀë¿ªÒ³ÃæÊ¼þ¼Ç¼£¬È»ºó¶Ô¶ÓÁÐÀï´æÔÚµÄ×îºóÒ»¸öË÷Òý¶ÔÓ¦µÄÒ³Ãæ£¨¼ÙÉèΪA£©½øÐÐÅжÏÊÇ·ñÔÚÕ»¶¥£¨ModalRoute.of(context).isCurrent
£©£¬Èç¹ûÊÇ£¬Ôò¶ÔAÒ³ÃæÖ´ÐнøÈëÒ³ÃæÊ¼þ¼Ç¼¡£
Õë¶ÔµÚ¶þ¸öÎÊÌ⣬RouteÀàÄÚÓиö³ÉÔ±±äÁ¿overlayEntries£¬¿ÉÒÔ»ñÈ¡µ±Ç°Route¶ÔÓ¦µÄËùÓÐͼ²ãOverlayEntry£¬ÔÚOverlayEntry¶ÔÏóÖÐÓиö³ÉÔ±±äÁ¿opaque¿ÉÒÔÅжϵ±Ç°Õâ¸öͼ²ãÊÇ·ñÈ«ÆÁ¸²¸Ç£¬´Ó¶ø¿ÉÒÔÅųýDialogºÍBottomSheetÕâÖÖÀàÐÍ¡£ÔÙ½áºÏÎÊÌâ1£¬»¹ÐèÒªÔÚÉÏÊö·½°¸ÖмÓÉ϶Ôpush½øÀ´µÄÐÂÒ³ÃæÀ´×öÅжÏÊÇ·ñΪһ¸öÓÐÐ§Ò³Ãæ¡£Èç¹ûÊÇÓÐÐ§Ò³Ãæ£¬²Å¶ÔË÷ÒýÁбíÖÐǰһ¸öÒ³Ãæ×öÀë¿ªÒ³ÃæÊ¼þ£¬ÇÒ½«ÓÐÐ§Ò³Ãæ¼Óµ½Ë÷ÒýÁбíÖС£Èç¹û²»ÊÇÓÐÐ§Ò³Ãæ£¬Ôò²»²Ù×÷Ë÷ÒýÁÐ±í¡£
ÒÔÉϲ¢²»ÊÇÏÐÓãµÄ·½°¸£¬Ö»ÊDZÊÕ߸ø³öµÄÒ»¸ö½¨Òé¡£ÒòΪÏÐÓãAPPÔÚÒ»¿ªÊ¼Â䵨Flutter¿ò¼Üʱ£¬¾ÍûÓÐʹÓÃFlutterÔÉúµÄÒ³ÃæÕ»¹ÜÀí·½°¸£¬¶øÊDzÉÓÃÁËNative+Flutter»ìºÏ¿ª·¢µÄ·½°¸¡£Òò´Ë½ÓÏÂÀ´Ò²ÊÇ»ùÓÚ´ËÀ´²ûÊöÏÐÓãµÄ·½°¸¡£
ÏÐÓãµÄ·½°¸ÈçÏ£¨ÒÔAndroidΪÀý£¬iOSͬÀí£©£º


×¢£ºÊ״δò¿ªÖ¸µÄÊÇ»ùÓÚ»ìºÏջдò¿ªÒ»¸öÒ³Ãæ£¬·ÇÊ״δò¿ªÖ¸µÄÊÇͨ¹ý»ØÍËÒ³ÃæµÄ·½Ê½£¬ÔÚºǫ́µÄÒ³ÃæÔٴε½Ç°Ì¨¿É¼û¡£
¿´ËÆÎÒÃǽ«ºÎʱȥ´¥·¢½øÈë/Àë¿ªÒ³ÃæÊ¼þµÄÅжϽ»¸øFlutter²à£¬Êµ¼ÊÉÏÒÀÈ»¸úNative²àµÄÒ³ÃæÕ»¹ÜÀí±£³ÖÁËÒ»Ö£¬½«ÔÏÈÔÚNative²à×ö´òÂñµãµÄʱ»ú¸æÖªFlutter²à£¬È»ºóFlutter²àÔÙÁ¢¿Ìͨ¹ýchannelÀ´µ÷ÓÃNative²àµÄ´òÂñµã·½·¨¡£ÄÇô¿ÉÄÜ»áÓÐÈËÎÊ£¬ÎªÊ²Ã´ÕâÃ´ÈÆ£¬²»È«²¿½»¸øNative²àÈ¥Ö±½Ó¹ÜÀíÄØ£¿½»¸øNative²àÈ¥Ö±½Ó¹ÜÀíÕâÑù×öÕë¶Ô·ÇÊ״δò¿ªÕâ¸ö³¡¾°ÊǺÏÊʵ쬵«ÊǶÔÊ״δò¿ªÕâ¸ö³¡¾°È´ÊDz»ºÏÊʵġ£ÒòΪÔÚÊ״δò¿ªÕâ¸ö³¡¾°Ï£¬onResumeʱFlutterÒ³ÃæÉÐδ³õʼ»¯£¬´Ëʱ»¹²»ÖªµÀÒ³ÃæÐÅÏ¢£¬Òò´ËÒ²¾Í²»ÖªµÀ½øÈëÁËÊ²Ã´Ò³Ãæ£¬ËùÒÔÐèÒªÔÚFlutterÒ³Ãæ³õʼ»¯£¨init£©Ê±ÔٻعýÀ´µ÷Native²àµÄ½øÈëÒ³ÃæÂñµã½Ó¿Ú¡£ÎªÁ˱ÜÃ⿪·¢ÈËԱȥ¹Ø×¢ÊÇ·ñΪÊ״δò¿ªFlutterÒ³Ãæ£¬Òò´ËÎÒÃÇͳһÔÚFlutter²àÀ´Ö±½Ó´¥·¢½øÈë/Àë¿ªÒ³ÃæÊ¼þ¡£
ÆØ¹â¿Óλ
ÏȽ²ÏÂÆØ¹â¿ÓλÔÚÎÒÃÇÕâÀïµÄ¶¨Ò壬ÎÒÃÇÈÏΪͼƬºÍÎı¾ÊÇÓÐÆØ¹âÒâÒåµÄ£¬ÆäËûÓû§¿´²»¼ûµÄÊÇûÓÐÆØ¹âÒâÒåµÄ£¬ÔÚ´ËÖ®ÉÏ£¬µ±Ò»¸ö¿ÓλͬʱÂú×ãÒÔÏÂÁ½µãʱ²Å»á±»ÈÏΪÊÇÒ»´ÎÓÐÐ§ÆØ¹â£º
¿ÓλÔÚÆÁÄ»¿É¼ûÇøÓòÖеÄÃæ»ý´óÓÚµÈÓÚ¿ÓλÕûÌåÃæ»ýµÄÒ»°ë¡£
¿ÓλÔÚÆÁÄ»¿É¼ûÇøÓòÖÐÍ£Áô³¬¹ý500ms¡£
»ùÓڴ˶¨Ò壬ÎÒÃÇ¿ÉÒԺܿìµÃ³öÈçÏÂͼËùʾµÄ³¡¾°£¬ÔÚÒ»¸ö¿ÉÒÔ¹ö¶¯µÄÒ³ÃæÉÏÓÐA¡¢B¡¢C¡¢D¹²4¸ö¿Óλ¡£ÆäÖУº
¿ÓλAÒѾ»¬³öÁËÆÁÄ»¿É¼ûÇøÓò£¬¼´invisible£»
¿ÓλB¼´½«ÏòÉÏ´ÓÆÁÄ»ÖпɼûÇøÓò»¬³ö£¬¼´visible->invisible£»
¿ÓλC»¹ÔÚÆÁÄ»ÖÐÑë¿ÉÊÓÇøÓòÄÚ£¬¼´visible£»
¿ÓλD¼´½«»¬ÈëÆÁÄ»ÖпɼûÇøÓò£¬invisible->visible£»

ÄÇôÎÒÃǵÄÎÊÌâ¾ÍÊÇÈçºÎËã³ö¿ÓλÔÚÆÁÄ»ÄÚÆØ¹âÃæ»ýµÄ±ÈÀý¡£ÒªËã³öÕâ¸öÖµ£¬ÐèÒªÖªµÀÒÔϼ¸¸öÊýÖµ£º
ÈÝÆ÷Ïà¶ÔÆÁÄ»µÄÆ«ÒÆÁ¿
¿ÓλÏà¶ÔÈÝÆ÷µÄÆ«ÒÆÁ¿
¿ÓλµÄλÖúͿí¸ß
ÈÝÆ÷µÄλÖúͿí¸ß
ÆäÖпÓλºÍÈÝÆ÷µÄ¿íºÍ¸ßºÜÈÝÒ×»ñÈ¡ºÍ¼ÆË㣬ÕâÀï¾Í²»ÔÙÀÛÊö¡£
»ñÈ¡ÈÝÆ÷Ïà¶ÔÆÁÄ»µÄÆ«ÒÆÁ¿
//¼àÌýÈÝÆ÷¹ö¶¯£¬µÃµ½ÈÝÆ÷µÄÆ«ÒÆÁ¿
double _scrollContainerOffset = scrollNotification.metrics.pixels; |
»ñÈ¡¿ÓλÏà¶ÔÈÝÆ÷µÄÆ«ÒÆÁ¿
//ÆØ¹â¿ÓλWidgetµÄcontext
final RenderObject childRenderObject = context.findRenderObject();
final RenderAbstractViewport viewport = RenderAbstractViewport.of (childRenderObject);
if (viewport == null) {
return;
}
if (!childRenderObject.attached) {
return;
}
//ÆØ¹â¿ÓλÔÚÈÝÆ÷Ä򵀮«ÒÆÁ¿
final RevealedOffset offsetToRevealTop = viewport.getOffsetToReveal (childRenderObject,
0.0); |
Âß¼ÅжÏ
//ÆØ¹â¿ÓλWidgetµÄcontext
final RenderObject childRenderObject = context.findRenderObject();
final RenderAbstractViewport viewport = RenderAbstractViewport.of
(childRenderObject);
if (viewport == null) {
return;
}
if (!childRenderObject.attached) {
return;
}
//ÆØ¹â¿ÓλÔÚÈÝÆ÷Ä򵀮«ÒÆÁ¿
final RevealedOffset offsetToRevealTop = viewport.getOffsetToReveal
(childRenderObject, 0.0); |
µã»÷¿Óλ
µã»÷¿ÓλÂñµãûʲôÄѵ㣬ºÜÈÝÒ׾ͿÉÒÔÏëµ½ÏÂÃæµÄ·½°¸£º

Ч¹û
¾¹ý¶àÂÖµü´úºÍÓÅ»¯£¬Ä¿Ç°ÏßÉÏFlutterÒ³ÃæµÄÂñµã׼ȷÂÊÒѾ´ïµ½100%£¬ÓÐÁ¦µØÖ§³ÖÁËÒµÎñµÄ·ÖÎöºÍÅжϡ£Í¬Ê±ÕâÌ×·½°¸ÈÃÒµÎñͬѧÔÚ×ö¿ª·¢Ê±£¬¶ÔÓÚÒ³Ãæ½øÈë/À뿪¡¢ÆØ¹â¿Óλ¿ÉÒÔ×öµ½ÎÞ¸ÐÖª£¬¼´²»ÓùØÐĺÎʱȥ´¥·¢£¬×öµ½Á˼òµ¥Ò×ÓúÍÎÞÇÖÈëÐÔ¡£
Õ¹Íû
´ËÍ⣬Õë¶ÔÒ³Ãæ½øÈë/À뿪Õâ¸ö³¡¾°£¬ÓÉÓÚÏÐÓãÊÇ»ùÓÚFlutter Boost»ìºÏÕ»µÄ·½°¸£¬Òò´ËÎÒÃǵĽâ¾ö·½°¸»¹²»¹»Í¨Óᣲ»¹ýδÀ´Ëæ×ÅÏÐÓãÉϵÄFlutterÒ³ÃæÔ½À´Ô½¶à£¬ÎÒÃǺóÐøÒ²»áȥʵÏÖ»ùÓÚFlutterÔÉúµÄ·½°¸¡£
ÔÚÏÐÓã×öÊý¾ÝÇý¶¯ÒµÎñÊÇÒ»¼þ·Ç³£ÖØÒªÇÒÓÐÒâÒåÊ£¬¶øÂñµãÖ±½ÓÓ°Ïì×ÅÊý¾Ý²É¼¯£¬ÂñµãµÄ¶ªÊ§ºÍ´íÎ󽫻áÈÃÎÒÃÇÔÚ´óº£ÉϺ½ÐÐʱʧȥµÆËþµÄÖ¸Òý¡£ÔÚÕâÀï´ó¼Ò¶¼Ï°¹ß×ÅÓÃÊý¾ÝÀ´Ö¸µ¼¹¤×÷·½Ïò£¬ÊÔÑé->È¡Êý¾Ý·ÖÎö->µ÷ÕûʵÑé->ÔÙÈ¡Êý¾Ý·ÖÎö->ÔÙµ÷ÕûʵÑé¡£Èç´ËÑ»·×Å£¬Ö»ÎªÕÒµ½×îÊʺÏÓû§µÄÄÇÒ»¸öÉè¼Æ¡£
|