Flutter: Cant 'использовать widget.variable для доступа к переменной виджета - PullRequest
1 голос
/ 26 апреля 2020

Я не могу использовать widget.message внутри _MenuStatefulWidgetState, ошибка: Получатель 'message' не определен для класса 'MenuStatefulWidget .

Я думаю, потому что я использую FutureBuilder и пытаюсь получить доступ к widget.message внутри builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) Как я могу решить эту проблему?

class MenuStatefulWidget extends StatefulWidget {
  MenuStatefulWidget({Key key, String message}) : super(key: key);

  @override
  _MenuStatefulWidgetState createState() => _MenuStatefulWidgetState();
}

class _MenuStatefulWidgetState extends State<MenuStatefulWidget> {
  Widget build(BuildContext context) {

    String storeID =
        Provider.of<AppData>(context, listen: true).selectedStoreId;
    String storeMenuFilename = 'store_$storeID.json';

    Future _menuDataFuture = getFile(storeMenuFilename);

    return FutureBuilder<dynamic>(
      future: _menuDataFuture,
      builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
        List<Widget> children;

        if (snapshot.hasData) {
          children = [];

          var storeData = snapshot.data;

          Provider.of<AppData>(context, listen: false).setStoreData(storeData);

          var menu = storeData['menu'];
          var itemOption = storeData['option'];

          for (var category in menu) {
            (category as Map<String, dynamic>).forEach((key, value) {
              children.add(CategoryWidget(name: key));
              for (var course in value) {
                children.add(LineWidget(course, itemOption));
              }
            });
          }
        } else if (snapshot.hasError) {
          children = <Widget>[
            Icon(
              Icons.error_outline,
              color: Colors.red,
              size: 60,
            ),
          ];
        } else {
              if (widget.message != null){
                  children.add(
                    Container(
                      margin: topBottomMargin,
                      child: Text(widget.message,
                      ),
                    ),
                  );
              }

          children.add(
            Container(
              padding: EdgeInsets.fromLTRB(0, 20, 0, 0),
              child: Center(
                child: Row(
                  mainAxisSize: MainAxisSize.min,
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    CircularProgressIndicator(),
                  ],
                ),
              ),
            ));
        }


        return Center(
          child: ListView(
            children: children,
          ),
        );
      },
    );
  }
}

Ответы [ 2 ]

3 голосов
/ 26 апреля 2020

Вам нужно создать переменную с именем message в вашем виджете, а затем предоставить ссылку на нее следующим образом:

class MenuStatefulWidget extends StatefulWidget {
  String message;

  MenuStatefulWidget({Key key, this.message}) : super(key: key);

  @override
  _MenuStatefulWidgetState createState() => _MenuStatefulWidgetState();
}

, используя приведенный выше код, мы объявили переменную с именем "message" в MenuStatefulWidget, и она будет присваивает значение, переданное в качестве параметра для MenuStatefulWidget. Теперь вы можете получить значение сообщения используя

widget.message
0 голосов
/ 26 апреля 2020
class MenuStatefulWidget extends StatefulWidget {
  String message;

  MenuStatefulWidget({Key key, String message}) : super(key: key);

  @override
  _MenuStatefulWidgetState createState() => _MenuStatefulWidgetState();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...