setState () вызывается в конструкторе. Могу ли я изменить состояние виджета из другого класса? - PullRequest
1 голос
/ 25 мая 2020

Я получаю эту ошибку, когда пытаюсь изменить состояние виджета, определяя пользовательскую функцию для установки состояния, а затем я вызываю эту функцию из нового созданного мной класса.

setState () вызывается в конструкторе: _MyHomePageState # da7 cc (состояние жизненного цикла: создано, нет виджета, не смонтировано)

HomePage:

import 'package:flutter/material.dart';
import 'package:ed_cell/auth_service.dart';
import 'package:flutter/scheduler.dart';

Widget authStatus = Text('Welcome');

class MyHomePage extends StatefulWidget {
  _MyHomePageState myHomePageState= new _MyHomePageState();
  @override
  _MyHomePageState createState() => myHomePageState;
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: [
        Container(
          decoration: BoxDecoration(
              color: Colors.white, borderRadius: BorderRadius.circular(10)),
          height: 575,
          child: Row(
            children: <Widget>[
              Column(
                children: [
                  Expanded(
                    child: Image.asset(
                      'assets/images/rocket.png',
                    ),
                  ),
                ],
              ),
              Expanded(
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: [
                    Text(
                      'U create\nWe support',
                      style:
                          TextStyle(fontSize: 80, fontWeight: FontWeight.bold),
                    ),
                    authStatus,
                  ],
                ),
              ),
            ],
          ),
        ),
      ],
    );
  }

  void onAuthChange() {
     var x=AuthService().status;
    if (AuthService().status == 'Sucessful Sign In') {
      setState(()  {
        authStatus = Text(
          'Welcome',
          style: TextStyle(color: Colors.grey, fontSize: 50),
        );
        print(x);
      });
      print('object'+x);
    } else {
      setState(()  {
        authStatus = RaisedButton(
          onPressed: null,
          color: Colors.deepOrange,
          child: Text(
            'Join Now',
            style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold),
          ),
        );
      });
    }
  }
}

AuthService:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:ed_cell/home_page.dart';

class AuthService{
  String status;

  signIn(email,password){
    FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password).then((user){
      print('Signed In '+user.user.uid);
      status='Sucessful Sign In';
    }).catchError((e){
      status='Failure in Sign In';
      print(e);
    });
    MyHomePage().myHomePageState.onAuthChange();
  }
}

1 Ответ

1 голос
/ 25 мая 2020

Ошибка связана с тем, что HomePage еще не вставлен в дерево виджетов. Вы можете вызвать setState из другого класса, как вы уже сделали правильно, но виджет HomePage должен быть где-то уже в дереве виджетов, чтобы он мог выполнять setState.

...