Флаттер SteamBuilder snapshot.data имеет значение null - PullRequest
0 голосов
/ 09 февраля 2020

Я новичок, чтобы трепетать. Я пытаюсь использовать SteamBuilder для получения данных снимка. Но snapshot.data возвращает ноль. snapshot.connectionState == ConnectionState.done имеет значение false. snapshot.hasData имеет значение false.

Это файл дротика, в который я пытаюсь получить данные снимка

return StreamBuilder<UserData>(
        stream: DatabaseService(uid: user.uid).userData,
        builder: (context, snapshot) {
          //print(snapshot.connectionState == ConnectionState.done);
          //print(snapshot.data);
          if(snapshot.hasData){
            print('snapshot has data');
            UserData userData = snapshot.data;
            return Form(
              key: _formKey,
              child: Column(
                children: <Widget>[
                  Text(
                    'Update your brew settings.',
                    style: TextStyle(fontSize: 18.0),
                  ),
                  SizedBox(height: 20.0),
                  TextFormField(
                    initialValue: userData.name,
                    decoration: textInputDecorator,
                    validator: (val) => val.isEmpty ? 'Please enter a name' : null,
                    onChanged: (val) => setState(() => _currentName = val),
                  ),
                  SizedBox(height: 10.0),
                  DropdownButtonFormField(
                    value: _currentSugars ?? userData.sugars,
                    decoration: textInputDecorator,
                    items: sugars.map((sugar) {
                      return DropdownMenuItem(
                        value: sugar,
                        child: Text('$sugar sugars'),
                      );
                    }).toList(),
                    onChanged: (val) => setState(() => _currentSugars = val ),
                  ),
                  SizedBox(height: 10.0),
                  Slider(
                    value: _currentStrength.toDouble() ?? userData.strength,
                    activeColor: Colors.brown[_currentStrength ?? userData.strength],
                    inactiveColor: Colors.brown[_currentStrength ?? userData.strength],
                    min: 100.0,
                    max: 900.0,
                    divisions: 8,
                    onChanged: (val) => setState(() => _currentStrength = val.round()),
                  ),
                  RaisedButton(
                      color: Colors.pink[400],
                      child: Text(
                        'Update',
                        style: TextStyle(color: Colors.white),
                      ),
                      onPressed: () async {
                        print(_currentName);
                        print(_currentSugars);
                        print(_currentStrength);
                      }
                  ),
                ],
              ),
            );
          } else {
            print('snapshot doesnt have data');
            return Loading();
          }
        }
    );

Это поток

Stream<UserData> get userData {
    return brewCollection.document(uid).snapshots().map(_userDataFromSnapshot);
  }

brewCollection-

  final CollectionReference brewCollection = Firestore.instance.collection('brews');

_userDataFromSnapshot

UserData _userDataFromSnapshot(DocumentSnapshot snapshot) {
    return UserData(
      uid: uid,
      name: snapshot.data['name'],
      sugars: snapshot.data['sugars'],
      strength: snapshot.data['strength']
    );
  }

UserData

class UserData {

  final String uid;
  final String name;
  final String strength;
  final int sugars;

  UserData({ this.uid, this.sugars, this.strength, this.name });
}

Поскольку я новичок во Flutter, я не знаю, как решить эту проблему. Пожалуйста, помогите мне. Спасибо.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020

Здесь вы не обрабатываете ошибку, поэтому будет сложно узнать, что происходит, просто увидев код, а также поймать ошибку на снимке как

if(snapshot.hasData){


  //Show widget with data

 }else if(snapshot.hasError){
   return Center(
     child:Text(snapshot.error.toString());
   );

 }else{
   return CircularProgressIndicator();
 }
0 голосов
/ 12 февраля 2020

Класс UserData должен был быть

class UserData {

  final String uid;
  final String name;
  final int strength; // type int not String
  final String sugars; // type String not int

  UserData({ this.uid, this.sugars, this.strength, this.name });
}

Я запутался с типами данных силы и сахара. Виноват. Это была глупая ошибка.

Спасибо, что ответили:)

0 голосов
/ 09 февраля 2020

Обычно вам нужно проверить 3 случая:

  • снимок равен нулю (до запуска любого потока или действия, обычно это верно при создании виджета)
  • снимок не равен нулю и данные недействительны / недействительны (поток зарегистрирован, но данные еще не переданы)
  • снимок не равен нулю, а данные действительны (полученные данные)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...