Получить SharedPreferences перед сборкой виджета - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу получить свой ИД пользователя до запуска сборки в моем виджете с состоянием. Если я сделаю это, то build будет отображаться до того, как я получу свой идентификатор. Если я помещу его в setstate, моя сборка будет сначала использовать пустую строку, а затем перерисовывать ее снова с моим идентификатором, но это вызовет ненужное поведение.

Так как мне решить эту проблему?

String _userid = '';
Future<Null> setUserid() async {
    SharedPreferences pref = await SharedPreferences.getInstance();

    _userid = pref.getString('FB_USER');

  }
  initState() {
    super.initState();
    setUserid();
  }

Строить

// Widget build
new Flexible(
          child: new StreamBuilder<QuerySnapshot>(
            stream: Firestore.instance
                .collection('users')
                .document(_userid)
                .collection('rooms')
                .snapshots(),
            builder:
                (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
              if (!snapshot.hasData) return new Text('Loading...');
              return new ListView(
                children: snapshot.data.documents
                    .map(
                      (DocumentSnapshot document) => new Text('lol'),
                      // )
                      //new OverviewPresentation(presentation: document),
                    )
                    .toList(),
              );
            },
          ),
        ),

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Вы не можете, но вы можете остерегаться того, чтобы это было null.Также легче переместить StreamBuilder в initState

String _userid = '';
dynamic _data;
Future<Null> setUserid() async {
    SharedPreferences pref = await SharedPreferences.getInstance();

    _userid = pref.getString('FB_USER');

    _data = await Firestore.instance
            .collection('users')
            .document(_userid)
            .collection('rooms')
            .snapshots().first;
    setState(() {});
  }
  initState() {
    super.initState();
    setUserid();
  }
  return new Flexible(
      child: 
          if(_data == null) return new Text('Loading...');
          return new ListView(
            children: _data.documents
                .map(
                  (DocumentSnapshot document) => new Text('lol'),
                  // )
                  //new OverviewPresentation(presentation: document),
                )
                .toList(),
          );
        },
      ),
    ),
0 голосов
/ 16 ноября 2018

Вы можете использовать FutureBuilder

Future<String> setUserid() async {
  SharedPreferences pref = await SharedPreferences.getInstance();

  _userid = pref.getString('FB_USER');
  return _userid;
}

@override
Widget build(BuildContext context) {
  return FutureBuilder(
  future: setUserid(),
  builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
    if (snapshot.hasData) {
      return ... // your widget
    } else return CircularProgressIndicator();
  });

Примерно так

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...