#flutter #flutter-layout
Вопрос:
У меня есть сомнения, я новичок в Flutter, и я хочу знать, есть ли лучший способ сделать то, что я хочу, пожалуйста, посмотрите следующий пример кода.
Это мой экран, и у меня есть классы, один из которых предназначен для случаев, когда высота устройства меньше 800, а другой-когда выше
class MyPageExample extends StatelessWidget {
@override
Widget build(BuildContext context) {
var screenSize = MediaQuery.of(context).size;
return Scaffold(
body: SafeArea(
child: screenSize.height > 800
? SignupLarge()
: SignupSmall()
)
);
}
}
Это мои два параметра состояния
class SignupLarge extends StatefulWidget {
const SignupLarge({ Key? key }) : super(key: key);
@override
_SingupLargeState createState() => _SingupLargeState();
}
class _SingupLargeState extends State<SignupLarge> {
@override
Widget build(BuildContext context) {
return Column(
children: [
// Wome widgets...
ElevatedButton(
onPressed: () => signupToFirebase(),
child: Text('Click me')
)
],
);
}
}
class SignupSmall extends StatefulWidget {
const SignupSmall({ Key? key }) : super(key: key);
@override
_SignupSmallState createState() => _SignupSmallState();
}
class _SignupSmallState extends State<SignupSmall> {
@override
Widget build(BuildContext context) {
return ListView(
children: [
// Wome widgets...
ElevatedButton(
onPressed: () => signupToFirebase(),
child: Text('Click me')
)
],
);
}
}
signupToFirebase(){
// I need to use setState here to show the loading widget
// await Firebase.instance.signupWithEmailAndPassword...
// I need to use setState here to hide the loading widget
}
Что я хочу сделать, так это использовать метод в своих классах с использованием setState, на самом деле я не могу, потому что мой метод не находится внутри моих классов, но если я помещу свой метод внутрь, я не смогу использовать один и тот же метод в обоих классах.
приведенный выше код-это просто пример того, как выглядит мой код, я пытаюсь показать загрузку, когда пользователь зарегистрирован.
Кто-нибудь знает, как правильно использовать setState для моего метода, используя оба класса?
Комментарии:
1. Почему вы создаете функцию вне класса ?
2. потому что я использую эту функцию в обоих классах, и если я помещу функцию в один класс, я не смогу использовать ее в другом классе
Ответ №1:
Вы можете дать этой функции другую функцию для ее вызова.
void signupToFirebase(void Function() whenDone) {
//...
whenDone();
}
...
// caller
signupToFirebase(() {
setState(() {
});
});
...
Или, что еще лучше, вы можете заставить эту функцию вернуть будущее, если то, что вы хотели сделать, — это действовать, как только это будет сделано.
Future<void> signupToFirebase() {
await FirebaseAuth.instance... signup() kind of function that returns a Future
}
...
// caller
await signupToFirebase();
setState(() {
});
...