在其状态类中访问有状态小部件的功能?扑

Posted

技术标签:

【中文标题】在其状态类中访问有状态小部件的功能?扑【英文标题】: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),
          ),
        ),
      ),
    );
  

【问题讨论】:

【参考方案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 我实际上最终将函数移到了有状态部分,并通过有状态构造函数传递了两个参数。我在某处读到这是一个很好的做法。

以上是关于在其状态类中访问有状态小部件的功能?扑的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:如何从浮动操作按钮调用小部件状态类的方法

如何从有状态小部件类 Flutter 访问小部件状态

如何在颤动的另一个有状态小部件中访问在一个有状态小部件中创建的对象

Flutter 中的有状态和无状态小部件之间的关系是啥?

如何在有状态或无状态小部件之外访问 BuildContext?

选择不依赖于状态的正确颤振块小部件