【问题标题】:Accessing a function of stateful widget in its state class? flutter在其状态类中访问有状态小部件的功能?扑
【发布时间】:2019-01-14 04:37:46
【问题描述】:

我试图在注销按钮的 onPressed 方法之后调用 _signOut 函数。但是它没有(识别函数或让我调用它)但是我可以调用widget.Onsignedout,它是父级的回调,一切都按预期工作。除了我在 auth.signout 上注销用户并回电只是为了更新表单。如何从状态类访问 _signOut()?谢谢

import 'package:flutter/material.dart';
import 'package:login_demo/auth.dart';
import 'package:login_demo/root_page.dart';

class HomePage extends StatefulWidget {
  HomePage({this.auth, this.onSignedOut});
  final BaseAuth auth;
  //To call a function of a parent, you can use the callback pattern
  final VoidCallback onSignedOut;

  void _signOut() async {
    try {
      Text('Signing Out here');
      await auth.signOut();
      onSignedOut;
    } catch (e) {
      print(e);
    }
  }

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

class _HomePageState extends State<HomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Homepage'),
        actions: <Widget>[
          FlatButton(
            child: Text(
              'Logout',
              style: TextStyle(fontSize: 17.0, color: Colors.white)
            ),
            onPressed: widget.onSignedOut,
          ),
        ],
      ),
      body: Container(
        child: Center(
          child: Text(
            'Welcome',
            style: TextStyle(fontSize: 32.0),
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: dart widget flutter statefulwidget


    【解决方案1】:

    首先,将您的_signOut 更改为signOut,以便其他文件可以访问它。或者更简单的解决方案,将您的函数移到 homepagestate statefulWidget 的 state 内。

    【讨论】:

    • 不要复制粘贴别人的答案
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案2】:

    您需要公开您的方法。现在由于名称前的下划线(_),该方法是私有的,您无法访问它。

    只需将名称从_signOut 更改为signOut,然后您就可以通过widget.signOut() 调用它。

    【讨论】:

    • 公开该方法似乎不起作用,我得到了错误。 “这里的表达式是一种'void',因此不能使用。如果我将“auth.signOut();”添加到回调onSignedout方法。它似乎工作。
    • 如果你正在做 onPressed: widget.signOut 尝试将其更改为 onPressed: () =&gt; widget.signOut() 并告诉我它是否有效 :) 你还可以做的是从 signOut() 方法中删除 void 因为它会返回一个Future
    • 我实际上最终将函数移到了有状态部分,并通过有状态构造函数传递了两个参数。我在某处读到这是一个很好的做法。
    猜你喜欢
    • 2021-05-19
    • 2020-04-26
    • 2019-10-14
    • 2021-12-15
    • 2021-10-05
    • 2019-09-21
    • 2020-03-18
    • 2021-10-28
    • 2021-01-14
    相关资源
    最近更新 更多