簡體   English   中英

如何在頁面加載時打開 Scaffold 的抽屜?

[英]How to open Scaffold's Drawer on page load?

登錄我們的 Flutter 應用程序會打開儀表板,儀表板有一個 Scaffold 和一個充滿菜單項的抽屜。

我想執行一些 A/B 測試,讓 Drawer 在頁面加載時打開,或者至少動畫 Drawer 在加載時立即打開。

我知道Scaffold.of(context).openDrawer()但我不確定把這段代碼放在哪里,以便它在 build() 方法之后立即運行。 我也不知道抽屜或腳手架上的任何字段會在抽屜打開時加載。

感謝您的時間和幫助。

在加載第一幀后,您需要等待。

    _onLayoutDone(_) {
       //your logic here

    }

    @override
    void initState() {
      WidgetsBinding.instance.addPostFrameCallback(_onLayoutDone);
      super.initState();
    }

我寫了一篇關於這個的帖子,如果您願意,可以看看: https : //medium.com/@diegoveloper/flutter-widget-size-and-position-b0a9ffed9407

覆蓋initState

@override
void initState() {
  super.initState();

  // use this
  Timer.run(() => Scaffold.of(context).openDrawer());
}

存儲狀態變量以隱藏和顯示抽屜isDrawerBeingShown

根據狀態變量切換抽屜狀態。 默認情況下將其設置為false,因此將首次顯示。

void _showDrawer(BuildContext context) async ,必須將其標記為異步,以便在build方法之后運行。

創建showDrawerUtility方法以在需要時按需顯示抽屜。

編輯:

使用GlobalKey

GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey();


class MainScreen extends StatefulWidget {

  MainScreen({Key key }) : super(key: key);

  @override
  State<MainScreen> createState() => new MainScreenState();
}

class MainScreenState extends State<MainScreen> {
  bool isDrawerBeingShown;

  @override
  void initState() {
    super.initState();
    isDrawerBeingShown = false;
    _showDrawer(context);
  }

  void _showDrawer(BuildContext context) async {
    if(!isDrawerBeingShown) {
     _scaffoldKey.currentState.openDrawer();
      setState(() => isDrawerBeingShown = true);
    }
  }
 @override
  Widget build(BuildContext context) { // build method goes here}
}

按照我基於 flutter 2.5.3 的代碼

    import 'package:easy_debounce/easy_debounce.dart';
    import 'package:flutter/material.dart';

    GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey();

    class openDrawerOnLoadPage extends StatefulWidget {
      openDrawerOnLoadPage({Key? key}) : super(key: key);

      @override
      _openDrawerOnLoadPageState createState() =>     _openDrawerOnLoadPageState();
    }

    class _openDrawerOnLoadPageState extends State<openDrawerOnLoadPage> {

      late bool isDrawerBeingShown;

      @override
      void initState() {
        super.initState();
        isDrawerBeingShown = false;
        _showDrawer(context);
      }

      void _showDrawer(BuildContext context) async {
        if (!isDrawerBeingShown) {
          EasyDebounce.debounce('openDrawer', Duration(milliseconds: 100),
              () async {
            _scaffoldKey.currentState!.openDrawer();
            setState(() => isDrawerBeingShown = true);
          });
        }
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          key: _scaffoldKey,
          
        );
      }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM