[英]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.