Было выдано следующее утверждение building Builder: setState() или markNeedsBuild(), вызываемое во время сборки?

#mysql #flutter

#mysql #флаттер

Вопрос:

я новичок в flutter, но на самом деле я не вижу, в чем ошибка в моем коде, сначала он продолжает показывать, что: было выдано следующее утверждение building Builder: setState() или markNeedsBuild(), вызванное во время сборки. и когда я выполняю горячую перезагрузку, появляется строка 4016 поз 12: ‘!_debugLocked’: неверно. я не знаю, что делать и почему это происходит, потому что это первый раз

 
class _RepresentativeUiState extends State<RepresentativeUi> {
  int _currentIndex = 0;
  // navy bottom pages
  final _newsFeedPage = RNewsFeed();
  final _profilePage = RProfile();
  final _addPostPage = RAddPost();
  final _libraryPage = RLibrary();
  Widget _showPage = RNewsFeed();
  Widget _pageChooser(int page) {
    switch (page) {
      case 0:
        return _newsFeedPage;
        break;
      case 1:
        return _addPostPage;
        break;
      case 2:
        return _libraryPage;
        break;
      case 3:
        return _profilePage;
        break;
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      bottomNavigationBar: CurvedNavigationBar(
        index: _currentIndex,
        items: <Widget>[
          Icon(
            FontAwesomeIcons.newspaper,
            size: 30,
          ),
          Icon(
            FontAwesomeIcons.plus,
            size: 30,
          ),
          Icon(
            FontAwesomeIcons.book,
            size: 30,
          ),
          Icon(
            FontAwesomeIcons.user,
            size: 30,
          ),
        ],
        color: Colors.white,
        buttonBackgroundColor: Colors.white,
        backgroundColor: Color(0xff131535),
        animationCurve: Curves.easeIn,
        animationDuration: Duration(milliseconds: 400),
        onTap: (int tappedIndex) {
          setState(() {
            _showPage = _pageChooser(tappedIndex);
          });
        },
      ),
      body: Container(
        child: _showPage,
      ),
    );
  }
}



class RNewsFeed extends StatefulWidget {
  @override
  _RNewsFeedState createState() => _RNewsFeedState();
}

class _RNewsFeedState extends State<RNewsFeed> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('1'),
    );
  }
}

class RAddPost extends StatefulWidget {
  @override
  _RAddPostState createState() => _RAddPostState();
}

class _RAddPostState extends State<RAddPost> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('2'),
    );
  }
}

class RLibrary extends StatefulWidget {
  @override
  _RLibraryState createState() => _RLibraryState();
}

class _RLibraryState extends State<RLibrary> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('3'),
    );
  }
}

class RProfile extends StatefulWidget {
  @override
  _RProfileState createState() => _RProfileState();
}


class _RProfileState extends State<RProfile> {
  String _name ;
@override
  void initState() {
    super.initState();
    SharedPreferences.getInstance().then((value) => {
      setState((){
        value.getString('name');
      })
    });
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Color(0xff131535),
      body: SingleChildScrollView(
        child: Container(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              CircleAvatar(
                radius: 50,
              ),
              Text(
                '$_name',
                style: TextStyle(color: Colors.black),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

  

Ответ №1:

Я считаю, что это виновник:

 SharedPreferences.getInstance().then((value) => {
  setState((){
    value.getString('name');
  })
});
  

Нет необходимости когда-либо вызывать setState() in initState() . Итак, что происходит сейчас, так это то, что во время сборки страницы setState() пытается инициировать другой процесс сборки. Просто удалите оболочку setState value.getString('name'); .

Комментарии:

1. даже если я удалю всю инструкцию, ошибка появится снова

2. можете ли вы дать мне код того, что я должен делать именно?

3. Я действительно не могу, потому что это единственный setState(), который я вижу. Возможно, что-то не так в других вызываемых вами классах.

4. так что, по вашему мнению, я должен его удалить?

5. Да, никогда не используйте setState() в initState()