#flutter #dart
#flutter #dart
Вопрос:
У меня есть метод с именем handleSignIn. Я хочу вызвать его внутри класса, который обрабатывает вход, когда ориентация экрана является мобильной. Как я могу получить доступ к методу из одного класса в другой класс?
это мой первый класс
class _SignInState extends State<SignIn> {
@override
void initState() {
super.initState();
MsalMobile.create('assets/auth_config.json', authority).then((client) {
setState(() {
msal = client;
});
refreshSignedInStatus();
});
}
/// Signs a user in
void handleSignIn() async {
await msal.signIn(null, [SCOPE]).then((result) {
// ignore: unnecessary_statements
refreshSignedInStatus();
}).catchError((exception) {
if (exception is MsalMobileException) {
logMsalMobileError(exception);
} else {
final ex = exception as Exception;
print('exception occurred');
print(ex.toString());
}
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Scaffold(
backgroundColor: Color(0xff392850),
body: Responsive(
mobile: _HomeScreenMobile(
),
// desktop: _HomeScreenDesktop(),
),
),
);
}
}
мой класс _HomeScreenMobile
class _HomeScreenMobile extends StatelessWidget{
bool isSignedIn = false;
Widget build(BuildContext context) {
ProgressDialog progressDialog = ProgressDialog(context, type:ProgressDialogType.Normal, isDismissible: false, );
progressDialog.style(message: "Signing you in ...");
return Scaffold(
body: Builder(
builder: (context) => Stack(
fit: StackFit.expand,
children: <Widget>[
Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Image.asset('assets/landing.webp',
fit: BoxFit.fill,
color: Color.fromRGBO(255, 255, 255, 0.6),
colorBlendMode: BlendMode.modulate),
),
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(height: 10.0),
Container(
width: 130.0,
child: Align(
alignment: Alignment.center,
child: RaisedButton(
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(30.0)),
color: Color(0xffffffff),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Icon(
FontAwesomeIcons.microsoft,
color: Color(0xFF01A6F0),
),
// Visibility(
// visible: !isSignedIn,
SizedBox(width: 10.0),
Visibility(
visible: !isSignedIn,
child: Text(
'Sign in',
style: TextStyle(
color: Colors.black, fontSize: 18.0),
),
),
],
),
onPressed: () => {
progressDialog.show(),
handleSignIn(),
})),
)
],
),
],
),
),
);
}
}
как я могу получить доступ к handleSign из _HomeScreenMobile, чтобы он не выдавал ошибку The method 'handleSignIn' isn't defined for the type '_HomeScreenMobile'.
. Пробовали пройти общий пример, но безуспешно
Ответ №1:
HomeScreenMobile может получить его ссылку в качестве параметра и вызывать его всякий раз, когда это необходимо.
class _HomeScreenMobile extends StatelessWidget{
bool isSignedIn = false;
_HomeScreenMobile({this.handleSignInReference});
final Future<void> Function() handleSignInReference;
...
onPressed: () => {
progressDialog.show(),
handleSignInReference(),
}
}
Наконец, где вы вызываете этот класс:
Responsive(
mobile: _HomeScreenMobile(
handleSignInReference:handleSignIn
),
)
Ответ №2:
Вы могли бы создать handle_signin.dart
файл:
void handleSignIn() async {
await msal.signIn(null, [SCOPE]).then((result) {
refreshSignedInStatus();
}).catchError((exception) {
if (exception is MsalMobileException) {
logMsalMobileError(exception);
} else {
final ex = exception as Exception;
print('exception occurred');
print(ex.toString());
}
});
}
Импортируйте его везде, где вам это нужно:
import './handle_signin.dart`;
И использовать его:
@override
Widget build() {
return Scaffold(body: Center(GestureDetector(onTap: () async { await handleSignIn(); })));
}
Важное примечание: хотя приведенный выше код может работать в вашем случае, настоятельно рекомендуется рассмотреть более сложные подходы к управлению состоянием и Widget
взаимодействию, такие как BLoC .
Комментарии:
1. и, если я просто хочу получить к нему доступ из основного файла вместо создания другого файла? и получить доступ к handleSignIn() при нажатии кнопки?