Лучший способ использовать setState в методе для двух классов в Flutter

#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(() {

  });
...