Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在颤振(Dart)中从另一个类调用方法?_Dart_Flutter - Fatal编程技术网

如何在颤振(Dart)中从另一个类调用方法?

如何在颤振(Dart)中从另一个类调用方法?,dart,flutter,Dart,Flutter,我已经创建了一个主页,用户可以登录该应用程序,在下一个屏幕中,用户可以看到他们的个人资料信息(仅个人资料名称)和下方的“注销”按钮。用户可以使用“注销”按钮从应用程序注销。但这对我不起作用 我想通过按details.dart中的signOut按钮从main.dart调用signOut方法(这两个类在不同的文件中) 但当我按“详细信息”中的“退出”按钮时,dart什么也没发生 代码如下: 主飞镖 import 'dart:async'; import 'package:flutter/mater

我已经创建了一个主页,用户可以登录该应用程序,在下一个屏幕中,用户可以看到他们的个人资料信息(仅个人资料名称)和下方的“注销”按钮。用户可以使用“注销”按钮从应用程序注销。但这对我不起作用

我想通过按details.dart中的signOut按钮从main.dart调用signOut方法(这两个类在不同的文件中)

但当我按“详细信息”中的“退出”按钮时,dart什么也没发生

代码如下:

主飞镖

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'details.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      debugShowCheckedModeBanner: false,
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  MyHomePageState createState() => MyHomePageState();
}

class MyHomePageState extends State<MyHomePage> {
  final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  final  GoogleSignIn googleSignIn = GoogleSignIn();
  static bool _LoginButton = true;

  void signOut(){
    googleSignIn.signOut();
    setState((){
      _LoginButton = true;
    });
    print(_LoginButton);
    print("User Signed Out");
  }

  Future<FirebaseUser> _signIn() async{
    if(_LoginButton==true){
      setState((){
        _LoginButton=false;
      });
      GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
      GoogleSignInAuthentication googleSignInAuthentication = await googleSignInAccount.authentication;
      FirebaseUser firebaseUser = await firebaseAuth.signInWithGoogle(idToken: googleSignInAuthentication.idToken, accessToken: googleSignInAuthentication.accessToken);
      print("Username is "+firebaseUser.displayName);
      setState((){
        _LoginButton = true;
      });
      Navigator.push(context, MaterialPageRoute(builder: (context) => details(firebaseUser.displayName,signOut)));

      return firebaseUser;
    }
  }

  bool _LoginButtonBool(){
    return _LoginButton;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Google auth with firebase"),),
      body: Center(
        child: _LoginButtonBool()?Container(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              MaterialButton(onPressed: _LoginButtonBool() ? () => _signIn().then((FirebaseUser firebaseuser ) =>print(firebaseuser)).catchError((e) => print(e)): null,
              child: Text("Login"),color: Colors.orange,),
            ],
          ),
        ):CircularProgressIndicator(backgroundColor: Colors.greenAccent.withOpacity(0.01),),
      ),
    );
  }
}
导入'dart:async';
进口“包装:颤振/材料.省道”;
导入“包:firebase_auth/firebase_auth.dart”;
导入“包:google_sign_in/google_sign_in.dart”;
导入“details.dart”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主题:新主题数据(
主样本:颜色。蓝色,
),
debugShowCheckedModeBanner:false,
主页:新建MyHomePage(),
);
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
MyHomePageState createState()=>MyHomePageState();
}
类MyHomePageState扩展了状态{
final FirebaseAuth FirebaseAuth=FirebaseAuth.instance;
最终谷歌签名谷歌签名=谷歌签名();
静态bool_LoginButton=true;
无效签出(){
googleSignIn.signOut();
设置状态(){
_LoginButton=true;
});
打印(登录按钮);
打印(“用户注销”);
}
Future\u sign()异步{
如果(_LoginButton==true){
设置状态(){
_LoginButton=false;
});
GoogleSignInAccount GoogleSignInAccount=等待googleSignIn.signIn();
GoogleSignInAuthentication GoogleSignInAuthentication=等待googleSignInAccount.authentication;
FirebaseUser FirebaseUser=使用Google等待firebaseAuth.Signin(idToken:googleSignInAuthentication.idToken,accessToken:googleSignInAuthentication.accessToken);
打印(“用户名为”+firebaseUser.displayName);
设置状态(){
_LoginButton=true;
});
Navigator.push(上下文,MaterialPage路由(生成器:(上下文)=>details(firebaseUser.displayName,signOut));
返回firebaseUser;
}
}
bool_LoginButtonBool(){
返回登录按钮;
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(标题:文本(“Google auth with firebase”),
正文:中(
子项:_LoginButtonBool()?容器(
子:列(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
MaterialButton(On Pressed:_LoginButtonBool()?()=>_signIn()。然后((FirebaseUser FirebaseUser)=>print(FirebaseUser))。catchError((e)=>print(e)):null,
子项:文本(“登录”),颜色:Colors.orange,),
],
),
):CircularProgressIndicator(背景色:Colors.greenAccent.withOpacity(0.01)),
),
);
}
}
细节,省道

import 'package:flutter/material.dart';
import 'package:flutter_auth/main.dart';

class details extends StatelessWidget {
  String name;
  final Function callback;
  details(this.name,this.callback);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:Center(child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceAround,
        children: <Widget>[
          Text(name),
          MaterialButton(onPressed: () => callback,
          child: Text("Log out"),color: Colors.orange),
        ],
      ),),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:flatter_auth/main.dart”;
类详细信息扩展了无状态小部件{
字符串名;
最终函数回调;
详细信息(this.name、this.callback);
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:中心(子项:列)(
mainAxisAlignment:mainAxisAlignment.spaceAround,
儿童:[
文本(名称),
MaterialButton(按下时:()=>回调,
子项:文本(“注销”),颜色:Colors.orange),
],
),),
);
}
}

在DetailsPage中导入HomePage类并从中创建一个新实例,然后调用所需的方法(如果该方法是公共的)。

您必须小心尝试执行的操作,因为您可能正在访问未装入的页面/小部件。想象你做了一个
推式更换(新材料路线(…)
。上一页在树中不再可用,因此您无法访问它或它的任何方法

除非树中有明确的父子关系,否则应该将逻辑抽象为外部逻辑类或业务逻辑类。因此,您可以确定您正在调用类的活动实例

下面是一个可以用来传递业务对象的示例。如果您使用其他模式,比如BLOC、ScopedModel、Streams等,会更好。但是为了简单起见,我认为这应该足够了

import "package:flutter/material.dart";

void main() {
  runApp(MyApp(new Logic()));
}

class Logic {
  void doSomething() {
    print("doing something");
  }
}

class MyApp extends StatelessWidget {
  final Logic logic;

  MyApp(this.logic);

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new HomePage(widget.logic),
    );
  }
}

class HomePage extends StatelessWidget {
  final Logic logic;

  HomePage(this.logic);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlatButton(
          onPressed: () { Navigator.of(context).pushReplacement(
             MaterialPageRoute(
               builder: (context) => AnotherPage(logic),
             ))},
          child: Text("Go to AnotherPage"),
        ),
      ),
    );
  }
}

class AnotherPage extends StatelessWidget {
  final Logic logic;

  AnotherPage(this.logic);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlatButton(
          onPressed: logic.doSomething,
          child: Text("Press me"),
        ),
      ),
    );
  }
}
如果仍要调用另一个页面中的函数,并且您确定该页面已装入(您已执行了
推送
而不是
推送替换
),则可以执行以下操作。(小心轻放)


您可以创建另一个logout()函数,并提供主页的上下文,以便推回登录屏幕/主页屏幕,其作用如下:

      logout() async {
        await googleSignIn.signOut();
        Navigator.push(context, MaterialPageRoute(builder: (context) => Home()));
      }

这很简单,让我用一个例子来解释

class Animals
{
  var animalList = ['dog','cat','cow'];

  // function for printing the list of animals

  void animalListPrinter(){
    for(var animal in animalList){
        print(animal);

     }
  }
}
将上述函数调用到另一个类

class ShowingAnimalList extends StatelessWidget {
     final Animals ani= new Animals();
     @override
     Widget build(BuildContext context) {
       return GestureDetector(
         onTap: ani.animalListPrinter(),
       );
  }
}
您可以从父类调用具有此属性的任何小部件


我们可以很容易地访问它,如下所示

className().MethodName(),

我们可以使用帮助实例制作下面给出的实例

varobjectName=newclassname()

注意:我们可以像这个例子一样使用空构造函数

 class Student{
void female(){
print('This is female method');
}
void male(){
print('This is malemethod'); }
}
步骤1:var\u instance1=新学生();这没关系


步骤2:_instance1.male();调用方法\u instance1我们想要什么。

您尝试过使用回调吗?我尝试使用Callback,但我收到一个错误,上面写着“此处的表达式具有“void”类型,因此无法使用。详细信息。dart:更改MaterialButton(onPressed:()=>Callback,更改为MaterialButton(onPressed:()=>Callback()),虽然这无法解决您在此处尝试执行的操作,但也不会将您推回到登录屏幕。@anmol.majhail我不知道为什么,但这对我很有效!!谢谢,如果您能解释一下,那对我来说会更好。@yash1173要执行一个我们需要称之为乐趣的函数
 class Student{
void female(){
print('This is female method');
}
void male(){
print('This is malemethod'); }
}