Как установить appTitle в зависимости от страницы, на которую нажимает пользователь? - PullRequest
0 голосов
/ 26 мая 2020

Домашняя страница имеет вид плана этажа, и в каждой комнате «отображаются» разные работы (см. Прикрепленное изображение) HomePage

Название галереи {salmonComplex} отображается в виде заголовка при открытии приложения но когда пользователь записывает в одну из комнат, я хочу, чтобы имя комнаты заменило или появилось под {salmonComplex}

, я создал класс MainPageHeading и List<String> для генерации заголовка с int mainPageNumber, чтобы я мог сгенерировать заголовок (я позаимствовал идею из одного из приложений-викторин, которые я создал из недавнего курса).

Вот что

Есть ли способ показать разные имена комнат без необходимости реплицировать весь класс, например, использовать весь код внутри нового имени класса, скажем, originalExhibitionHeading.

Я имею в виду, что это длинно, но есть ли способ использовать список и пакет битов i необходимость.

Сейчас он просматривается в списке через MainPageHeading []. Это блокирует заголовок страницы. Есть ли лучший способ разбить заголовок комнаты в зависимости от того, в какую комнату входит пользователь.

любые мысли сэкономят мне время.

спасибо

    class MainPageHeading extends StatefulWidget {
    @override
    _MainPageHeadingState createState() => _MainPageHeadingState();
    }

    class _MainPageHeadingState extends State<MainPageHeading> {
    List<String> mainPageHeading = [
    '{ theSalmon', //0 mainloading page heading
    'Complex', //1
    ' }' //2
    ];

    int mainPageNumber = 0;

    @override
    Widget build(BuildContext context) {
     return Container(
      child: RichText(
       text: TextSpan(
        text: mainPageHeading[0],
         style: TextStyle(
            color: Colors.grey[700],
            fontFamily: 'saturn',
            fontSize: 25.0,
            fontWeight: FontWeight.bold),
        children: [
          TextSpan(
              text: mainPageHeading[1],
              style: TextStyle(
                color: Colors.grey[500],
                fontFamily: 'saturn',
                fontSize: 25.0,
                fontStyle: FontStyle.italic,
              )),
          TextSpan(
              text: mainPageHeading[2],
              style: TextStyle(
                color: Colors.grey[700],
                fontFamily: 'saturn',
                fontSize: 25.0,
                fontWeight: FontWeight.bold,
              )),
             ]),
            textAlign: TextAlign.center,
           ),
          );
          }
         }



           [homePage][1]

emulator img

    void main() {
    runApp(AppState());
    }

    class AppState extends StatefulWidget {
    @override
    _AppStateState createState() => _AppStateState();
    }

    class _AppStateState extends State<AppState> {
    var titleText = "FirstTitle";

     @override
    Widget build(BuildContext context) {
    return MaterialApp(
      title: "Titolo",
      theme: ThemeData(primarySwatch: Colors.blue),
      home: Scaffold(
        appBar: AppBar(
          title: TitleWidget(),
        ),
        body: Center(
          child: FlatButton(
            child: Text("Change title"),
            onPressed: () {
              setState(() {
                titleText = "Other Title";
              });
            },
          ),
        ),
      ),
      );
     }
     }

     class TitleWidget extends StatelessWidget {
     final titleText;

     TitleWidget({this.titleText});

    @override
    Widget build(BuildContext context) {
     return Text(titleText);
    }
    }

1 Ответ

0 голосов
/ 26 мая 2020

Я написал для вас образец кода, чтобы показать, как делать подобные вещи.

void main() {
  runApp(AppState());
}

class AppState extends StatefulWidget {
  @override
  _AppStateState createState() => _AppStateState();
}

class _AppStateState extends State<AppState> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: "Titolo",
        theme: ThemeData(primarySwatch: Colors.blue),
        home: HomeScreen());
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  List<String> mainPageHeading = [
    '{ theSalmon', //0 mainloading page heading
    'Complex', //1
    ' }' //2
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: TitleWidget(
          mainPageHeading: mainPageHeading,
        ),
      ),
      body: Center(
        child: FlatButton(
          child: Text("Change title"),
          onPressed: () {
            setState(() {
              mainPageHeading = ["The", "Other", "Title"];
            });
          },
        ),
      ),
    );
  }
}

class TitleWidget extends StatelessWidget {
  final List<String> mainPageHeading;

  TitleWidget({@required this.mainPageHeading});

  @override
  Widget build(BuildContext context) {
    return Container(
      child: RichText(
        text: TextSpan(
            text: mainPageHeading[0],
            style: TextStyle(
                color: Colors.grey[700],
                fontFamily: 'saturn',
                fontSize: 25.0,
                fontWeight: FontWeight.bold),
            children: [
              TextSpan(
                  text: mainPageHeading[1],
                  style: TextStyle(
                    color: Colors.grey[500],
                    fontFamily: 'saturn',
                    fontSize: 25.0,
                    fontStyle: FontStyle.italic,
                  )),
              TextSpan(
                  text: mainPageHeading[2],
                  style: TextStyle(
                    color: Colors.grey[700],
                    fontFamily: 'saturn',
                    fontSize: 25.0,
                    fontWeight: FontWeight.bold,
                  )),
            ]),
        textAlign: TextAlign.center,
      ),
    );
  }
}

Заголовок AppBars устанавливается из переменной titleText. У меня есть FlatButton с функцией, которая меняет titleText на другой текст. Обратите внимание, что я изменяю эту переменную в блоке setState. setState заставляет flutter перезагружать ваш UI, обновляя все, что изменилось. Поэтому, когда я нажимаю кнопку, переменная обновляется, и пользовательский интерфейс перезагружается, чтобы отобразить новый заголовок. один из ваших разделов, поместите туда setState и обновите все переменные, которые вам нужны для управления заголовком.

Я надеюсь, что это имеет смысл, если вам нужна дополнительная помощь, не стесняйтесь спрашивать. Удачи!

РЕДАКТИРОВАТЬ: Извините, я протестировал Код с другой настройкой экрана, что вызвало некоторые из ваших проблем. Я переместил код HomeScreen в отдельный виджет. Это хорошая практика и требуется, если вы хотите позвонить по номеру setState (как это делаем мы). Причина, по которой вы получали красную полосу, заключалась в том, что вы никогда не передавали titleText в виджет, поэтому он пытался получить строку, которой не существует, и выдал ошибку.

Также обязательно следите за ваше окно вывода, когда что-то пойдет не так, обычно выдает полезные сообщения об ошибках (прокрутите журнал ошибок до верхней части, это самая важная часть).

...