[英]Call a method in one class from another class in flutter and dart
[英]How to call method from another class in Flutter(Dart)?
我創建了一個主頁,該用戶可以登錄該應用程序,在下一個屏幕中,用戶可以看到他們的個人資料信息(僅個人資料名稱),並在其下方是注銷按鈕。 用戶可以使用退出按鈕從應用程序退出。但這對我不起作用。
我想通過在 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),),
),
);
}
}
詳細信息.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),
],
),),
);
}
}
您必須小心嘗試執行的操作,因為您可能正在訪問未安裝的頁面/小部件。 想象一下你做了一個pushReplacement(new MaterialPageroute(...))
。 上一頁在樹中不再可用,因此您無法訪問它或其任何方法。
除非您的樹中有明確的父子關系,否則您應該將邏輯抽象為外部或業務邏輯類。 因此,您確定您正在調用類的活動實例。
以下是您可以使用的傳遞 Business 對象的示例。 如果您使用其他模式,如 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"),
),
),
);
}
}
如果您仍想調用另一個 Page 中的函數,並且您確定該頁面已安裝(您執行的是push
而不是pushReplacement
),您可以執行以下操作。 (小心輕放)
class HomePage extends StatelessWidget {
HomePage();
void onCalledFromOutside() {
print("Call from outside");
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: () { Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => AnotherPage(onCalledFromOutside),
))},
child: Text("Go to AnotherPage"),
),
),
);
}
}
class AnotherPage extends StatelessWidget {
final Function callback
AnotherPage(this.callback);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onPressed: callback,
child: Text("Press me"),
),
),
);
}
}
很簡單讓我用一個例子來解釋
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(),
您可以創建另一個 logout() 函數並提供 home 上下文以推回登錄屏幕/主屏幕,對我來說如下:
logout() async {
await googleSignIn.signOut();
Navigator.push(context, MaterialPageRoute(builder: (context) => Home()));
}
在 DetailsPage 中導入 HomePage 類並從中創建一個新實例,然后調用您想要的方法(如果它是公共方法)。
我們可以通過下面給出的幫助實例Make 實例
var objectName = new ClassName(<constructor_arguments>)
注意:我們可以像這個例子一樣使用一個空的構造函數。
class Student{
void female(){
print('This is female method');
}
void male(){
print('This is malemethod'); }
}
第一步: var _instance1 = new Student(); 這里空的構造函數沒關系。
第二步:_instance1.male(); 調用方法 _instance1 我們想要什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.