dart - 如何从 Flutter(Dart) 中的另一个类调用方法?

标签 dart flutter

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

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

但是当我在 details.dart 中按下 signOut 按钮时没有任何反应!

代码如下:

main.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),),
      ),
    );
  }
}

details.dart

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),
        ],
      ),),
    );
  }
}

最佳答案

很简单,我举个例子来解释

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(),
       );
  }
}

You can call any Widget with this from the parent class

关于dart - 如何从 Flutter(Dart) 中的另一个类调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52549440/

相关文章:

dart - 如何对 map 值进行排序?

DART HttpRequest 不为 CORS OPTIONS 请求提供授权 header

firebase - 如何在 Cloud Firestore 中使用 Stream 回调

dart - Flutter 在一个条件下关闭一个对话框

android - 我如何让 flutter 显示文本文件的内容

firebase - 在 flutter 中实现 firebase 动态链接时,DynamicLinksClient 不可用错误

flutter - "theme: ThemeData..."显然从 Flutter 2.5.0 开始被忽略

arrays - 根据某些属性值从数组中删除重复项

flutter - 如何在Firestore中更新此内容?

dart - 在Dart PolymerElement中嵌套在另一个PolymerElement中