Как перестроить экран при изменении переменной в StreamBuilder - PullRequest
0 голосов
/ 13 июля 2020

Я пишу страницу входа в свое приложение Flutter. Я использую StreamBuilder для доступа к данным, поступающим из веб-сокета. Я декодирую json и хочу обновить переменную, которая определяет, аутентифицирован пользователь или нет. Когда пользователь аутентифицирован, я хочу перестроить экран и впоследствии показать пользователю новый экран. Я пробовал вызвать setState (() {}); в StreamBuilder, но получаю ошибку setState. Вот мой код:

@override
  Widget build(BuildContext context) {
    return (authenticated == 0)
    ? Scaffold(
      body: AnnotatedRegion<SystemUiOverlayStyle>(
        value: SystemUiOverlayStyle.light,
        child: GestureDetector(
          onTap: () => FocusScope.of(context).unfocus(),
          child: Stack(
            children: <Widget>[
              Container(
                height: double.infinity,
                width: double.infinity,
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    begin: Alignment.topCenter,
                    end: Alignment.bottomCenter,
                    colors: [
                      Color(0xFF73AEF5),
                      Color(0xFF61A4F1),
                      Color(0xFF478DE0),
                      Color(0xFF398AE5),
                    ],
                    stops: [0.1, 0.4, 0.7, 0.9],
                  ),
                ),
              ),
              Container(
                height: double.infinity,
                child: SingleChildScrollView(
                  physics: AlwaysScrollableScrollPhysics(),
                  padding: EdgeInsets.symmetric(
                    horizontal: 40.0,
                    vertical: 120.0,
                  ),
                  child: Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: <Widget>[
                      Text(
                        'SIARS',
                        style: TextStyle(
                          color: Colors.white,
                          fontFamily: 'OpenSans',
                          fontSize: 30.0,
                          fontWeight: FontWeight.bold,
                        ),
                      ),
                      SizedBox(height: 30.0),
                      _buildEmailTF(),
                      SizedBox(
                        height: 30.0,
                      ),
                      _buildPasswordTF(),
                      _buildForgotPasswordBtn(),
                      _buildLoginBtn(),
                      _buildSignupBtn(),
                      StreamBuilder(
                        stream: channel.stream,
                        builder: (context, snapshot) {
                          print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
                          if(snapshot.hasData)
                          {
                            String rawJson = snapshot.data;
                            Map<String, dynamic> inputMap = jsonDecode(rawJson);
                            print('RAWJSON: $rawJson');
                            if(inputMap['type'] == 'auth_response')  authenticated = inputMap['access'];
                            print('authentication: $authenticated');
                            setState(() {}); // ERROR
                          }
                          return (Text(''));
                        },
                      ),
                    ],
                  ),
                ),
              )
            ],
          ),
        ),
      )
    )
    : StreamBuilder<BluetoothState>(
        stream: FlutterBlue.instance.state,
        initialData: BluetoothState.unknown,
        builder: (c, snapshot) {
          final state = snapshot.data;
          if (state == BluetoothState.on) return FindDevicesScreen();
          return BluetoothOffScreen(state: state);
        }
    );
  }
}

...