【问题标题】:How to make drawer button UnClickable in Flutter如何在 Flutter 中使抽屉按钮不可点击
【发布时间】:2019-04-07 12:59:56
【问题描述】:

当我的应用启动时,一些数据会在后台加载我不希望用户当时点击Drawer图标,所以我做了这样的事情。

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text('Title'),
    ),
    drawer: _isLoading ? null : HomeDrawer(),
    body: _isLoading ? CircularProgressIndicator() : _body(),
  );
}

在这种情况下,当应用加载时抽屉按钮不可见

加载后,按钮返回。

我想要的是 抽屉按钮在加载状态下应该是可见的,但它不应该是可点击的。

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    你可以试试这个。

    bool _isLoading = false;
    GlobalKey<ScaffoldState> _key = GlobalKey();
    
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        key: _key,
        appBar: AppBar(
          title: Text("App"),
          leading: IconButton(
            icon: Icon(Icons.menu),
            onPressed: _isLoading ? null : () => _key.currentState.openDrawer(),
          ),
        ),
        drawer: YourDrawer(),
      );
    }
    

    【讨论】:

    • 感谢您再次回复我。真的很抱歉我还没有尝试过。我会让你我一两天。这些天我的考试正在进行中。希望你能理解。
    • 没问题,慢慢来,告诉我。祝你有美好的一天:)
    • 再次感谢您的帮助。
    【解决方案2】:

    我使用了自定义抽屉按钮,我根据_isLoaded 变量分配/删除它的 onPressed 事件。页面加载后 3 秒后,我将 _isLoaded 变量值设置为 true,这将重新呈现页面并启用抽屉按钮并隐藏加载器。

    class _MyHomePageState extends State<MyHomePage> {
      bool _isLoaded = false;
      final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
    
      @override
      void initState() {
        super.initState();
    
        this._apiCallSample();
      }
    
      void _apiCallSample() async {
        await Future.delayed(Duration(seconds: 3)).then((_) {
          setState(() {
            this._isLoaded = true;
          });
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            leading: IconButton(
              icon: Icon(Icons.menu),
              onPressed: !this._isLoaded ? null : () => this._scaffoldKey.currentState.openDrawer(),
            ),
            title: Text("Drawer"),
          ),
          body: Center(
            child: Builder(
              builder: (BuildContext context) {
                if(!this._isLoaded) {
                  return CircularProgressIndicator();
                }
    
                return Text("Loaded!");
              },
            ),
          ),
          drawer: Drawer(
            child: Center(
              child: Text("Drawer"),
            ),
          ),
          key: this._scaffoldKey,
        );
      }
    }
    

    如果您想阻止用户点击页面上的任何地方,请使用AbsorbPointer

    当吸收为真时,此小部件通过终止自身的命中测试来防止其子树接收指针事件。

    【讨论】:

    • 当然我也想到了添加自定义按钮,但是有什么属性或任何方法可以使抽屉按钮不可点击
    • 我想不到。尝试使用 AbsorbPainter。
    猜你喜欢
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多