Передача переменной другому классу из состояния другого класса

Я пытаюсь передать имя пользователя параметра, полученное из другого класса, в мой класс HomePage. Я хочу передать этот параметр из HomePageState в другой класс под названием Profile.

Я попытался использовать метод widget.username, чтобы получить доступ к параметру имени пользователя из _HomePageState. Но выдает ошибку: К члену экземпляра 'widget' нельзя получить доступ в инициализаторе.

Ниже для справки приведен код класса HomePage:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:codeforces_data_flutter/screens/profile.dart';

class HomePage extends StatefulWidget {
  String username;
  HomePage({this.username});

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

class _HomePageState extends State<HomePage> {
  static const widgetStyle =
      TextStyle(fontWeight: FontWeight.bold, fontSize: 30.0);

  int selectedIndex = 0;
  List<Widget> widgetsToDisplay = [
    Profile(
      username: widget.username,             /*Error is on this line*/
    ),
    Center(
      child: Text(
        'Index 1 : Previous Contests',
        style: widgetStyle,
      ),
    ),
    Center(
      child: Text(
        'Index 2 : Upcoming Contests',
        style: widgetStyle,
      ),
    ),
    Center(
      child: Text(
        'Index 3 : About Me',
        style: widgetStyle,
      ),
    ),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      bottomNavigationBar: BottomNavigationBar(
        items: <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(
              CupertinoIcons.profile_circled,
            ),
            label: 'User Profile',
            backgroundColor: Colors.teal,
          ),
          BottomNavigationBarItem(
            icon: Icon(
              CupertinoIcons.arrow_counterclockwise,
            ),
            label: 'Previous Contests',
            backgroundColor: Colors.blue,
          ),
          BottomNavigationBarItem(
            icon: Icon(
              CupertinoIcons.arrow_clockwise,
            ),
            label: 'Upcoming Contests',
            backgroundColor: Colors.green,
          ),
          BottomNavigationBarItem(
            icon: Icon(
              CupertinoIcons.suit_heart,
            ),
            label: 'About Me',
            backgroundColor: Colors.pink,
          ),
        ],
        currentIndex: selectedIndex,
        selectedItemColor: Colors.yellow,
        onTap: (index) {
          setState(() {
            selectedIndex = index;
          });
        },
      ),
      body: widgetsToDisplay[selectedIndex],
    );
  }
}

Проблема заключается в списке widgetsToDisplay, когда класс Profile вызывается с передачей widget.username в качестве свойства username.

Строку с ошибкой я выделил комментарием.

Любая помощь приветствуется. Спасибо.


person Dipanshu    schedule 02.05.2021    source источник


Ответы (2)


Ваш компилятор правильный, вы не можете получить доступ к этой переменной в инициализаторе, поэтому не делайте его инициализатором, когда вам это не нужно.

Переместите код сборки вашего виджета (в данном случае список) в функцию сборки или в отдельную функцию, которая затем вызывается в функции сборки.

person nvoigt    schedule 02.05.2021
comment
Это сработало отлично, спасибо. Но не могли бы вы немного объяснить, почему он не работал раньше и как работало добавление списка внутри метода сборки? - person Dipanshu; 02.05.2021

У меня была такая же проблема некоторое время назад. Попробуй это:

class HomePage extends StatefulWidget {
final username;
HomePage({this.username});

  @override
  _ HomePage State createState() => _ HomePage State(this.username);
}

class _HomePageState extends State<HomePage> {
  _HomePageState(String username) {
    this._username = username;
  }
  String _username;

Теперь вы можете использовать _username внутри вашего метода сборки.

person Raphael    schedule 02.05.2021
comment
Спасибо, Рафаэль, за ответ. Фактически, я вызывал класс Profile вне метода Build и столкнулся с проблемой из-за этого. Это помогло. Когда я переместил список внутри метода сборки, ошибка исчезла. - person Dipanshu; 02.05.2021