Ошибка: ошибка: поле экземпляра, не допускающее значения null, «Панель поиска» должно быть инициализировано. (В _SearchBarDemoHomeState() { Панель поиска = Панель поиска( )

#flutter #search

Вопрос:

Код:

 class SearchBarDemoApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
        title: 'Search Bar Demo',
        theme: new ThemeData(primarySwatch: Colors.blue),
        home: new SearchBarDemoHome());
  }
}

class SearchBarDemoHome extends StatefulWidget {
  @override
  _SearchBarDemoHomeState createState() => new _SearchBarDemoHomeState();
    }

class _SearchBarDemoHomeState extends State<SearchBarDemoHome> {
  final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
  SearchBar searchBar;

  AppBar buildAppBar(BuildContext context) {
    return new AppBar(
        title: new Text('Search Bar Demo'),
        actions: [searchBar.getSearchAction(context)]);
  }


  void onSubmitted(String value) {
    setState(() {
      var context = _scaffoldKey.currentContext;

      if (context == null) {
        return;
      }

      ScaffoldMessenger.maybeOf(context)
          ?.showSnackBar(
          new SnackBar(content: new Text('You wrote "$value"!')));
    });
  }
  _SearchBarDemoHomeState() {
    searchBar =  SearchBar(
        inBar: false,
        buildDefaultAppBar: buildAppBar,
        setState: setState,
        onSubmitted: onSubmitted,
        onCleared: () {
          print("Search bar has been cleared");
        },
        onClosed: () {
          print("Search bar has been closed");
        });
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Food3Rs'),
        backgroundColor: Colors.green,
      ),
    );
  }
}
 

Сообщение об ошибке: ошибка: Необходимо инициализировать поле экземпляра «Панель поиска», не допускающее значения null. (поле not_initialized_non_nullable_instance_field в [имя_старта] libmain.dart:167)
Больше никаких подробностей. Большое вам спасибо за вашу помощь!!!!!!!!!!!!!!! Не хватает слов….Поэтому я не могу успешно загрузить.Да, я могу загрузить его.

Ответ №1:

 _SearchBarDemoHomeState() {
    searchBar =  SearchBar(
        inBar: false,
        buildDefaultAppBar: buildAppBar,
        setState: setState,
        onSubmitted: onSubmitted,
        onCleared: () {
          print("Search bar has been cleared");
        },
        onClosed: () {
          print("Search bar has been closed");
        });
  }
 

Здесь вы создаете панель поиска. Внутри панели создания панели поиска вы пытаетесь создать панель приложений: buildDefaultAppBar: buildAppBar,

Но когда вы хотите создать панель приложений, вы еще не создали панель поиска, хотя и пытаетесь ее использовать:

 AppBar buildAppBar(BuildContext context) {
    return new AppBar(
        title: new Text('Search Bar Demo'),
        actions: [searchBar.getSearchAction(context)]);
  }
 

Поэтому он выдает эту ошибку. Вы пытаетесь использовать searchBar его до того, как он будет создан.

Ответ №2:

Вам нужно инициализироваться SearchBar . Либо инициализируйте его, сказав SearchBar searchBar = SearchBar(whateverGoesInside); , либо, если вы хотите инициализировать позже, вы можете добавить late ключевое слово спереди, например late SearchBar searchBar; , чтобы компилятор знал, что вы собираетесь инициализировать его позже.