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