Flutter — передача данных в PageView

Я пытаюсь ввести сообщение на одной странице моего просмотра страницы и хотел бы, чтобы это сообщение отображалось на другой странице. Я понимаю, как это можно сделать с помощью двух отдельных виджетов Scaffold, но изо всех сил пытаюсь понять, как это сделать внутри одного эшафота с вложенным стеком/просмотром страницы.

Вот где я настраиваю просмотр страницы:

class FrontOfCard extends StatefulWidget {

  String documentid;
  FirebaseImage image;

  FrontOfCard({this.documentid, this.image});

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

class _FrontOfCardState extends State<FrontOfCard> {
  PageController _pageController = PageController(
    initialPage: 0
  );

  int currentPage = 0;

  @override
  void dispose() {
    super.dispose();
    _pageController.dispose();
  }

  _onPageChanged(int index) {
    setState(() {
      currentPage = index;
    });
  }

  //Creating the message here
  String _message;

  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      appBar: PreferredSize(
        preferredSize: const Size.fromHeight(80),
        child: MainAppBar(
          text: 'front',
        ),
      ),
      body: Stack(
        alignment: AlignmentDirectional.bottomCenter,
        children: <Widget> [ PageView(
          scrollDirection: Axis.horizontal,
          controller: _pageController,
          onPageChanged: _onPageChanged,
          children: [
            Container(
              child: Padding(
                padding: const EdgeInsets.all(8.0),
                child: Image(image: widget.image),
              ),
            ),
            InsideLeft(),
            InsideRight(message: _message), // This is where the message variable will be populated with a String
    
            EndView(message: _message),// This is where I need the message to be displayed
          ],
        ),
          Stack(
            children: <Widget> [
              Container(
                margin: const EdgeInsets.only(bottom: 35),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget> [
                    for (int i = 0; i<=3; i++)
                      if (i == currentPage)
                        SlideDots(true) else SlideDots(false)
                  ],
                ),
              ),
            ],
          ),
      ]),
    );
  }
}

А вот мой InsideRight(), где я хочу, чтобы пользователь вводил свое сообщение:

class InsideRight extends StatefulWidget {
  const InsideRight({
    @required this.message,
    Key key
  }) : super(key: key);


  final String message;

  @override
  _InsideRightState createState() => _InsideRightState(message: this.message);
}

class _InsideRightState extends State<InsideRight> {

  String message;

  _InsideRightState({
    @required this.message,
  });
  
  final myController = TextEditingController(
  );


  @override
  void dispose() {
    // Clean up the controller when the widget is disposed.
    myController.dispose();
    super.dispose();
  }


  FontWeight fontWeight = FontWeight.w400;
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Padding(
        padding: const EdgeInsets.all(8.0),
        child: Column(
          children: [
            Container(
                decoration: BoxDecoration(
                  border: Border.all(color: Colors.black26),
                ),
                width: MediaQuery.of(context).size.width * 0.8,
                height: MediaQuery.of(context).size.height * 0.7,
                child: Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: TextField(
                    decoration: new InputDecoration.collapsed(
                        hintStyle: TextStyle(fontFamily: FontNameDefault),
                        hintText: ''),
                    keyboardType: TextInputType.multiline,
                    maxLines: null,
                    controller: myController,
                      onChanged:  (String _) {
                      setState(() {
                        message = _;
                      });
                    },
                  ),
                )),
          ],
        ),
      ),
    );
  }
}

И мой EndView, где мне нужно, чтобы отображалось сообщение:

    class EndView extends StatefulWidget {
  const EndView({
    @required this.message,
    Key key
  }) : super(key: key);

  final String message;


  @override
  _EndViewState createState() => _EndViewState(message: this.message);
}



class _EndViewState extends State<EndView> {

  String message;

  _EndViewState({
    @required this.message,
  });

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text(message ?? 'Empty'),
      ],
    );
  }
}

Какие-либо предложения? Спасибо


person TJMitch95    schedule 22.09.2020    source источник
comment
Используйте пакет Провайдер.   -  person Develocode 777    schedule 23.09.2020


Ответы (1)


Пакет Provider может быть очень полезен для использования данных, передаваемых между экранами и виджетами.

Пакет: https://pub.dev/packages/provider
Например, я используйте этот пакет для передачи данных аутентификации и хранения между моими экранами без необходимости передачи одного и того же аргумента для следующего экрана, следующего и т. д.
Я настоятельно рекомендую прочитать документы, но если вы боретесь с этим, могу порекомендовать вам несколько видео на YouTube, которые могут вам помочь: https://www.youtube.com/watch?v=vFxk_KJCqgk&ab_channel=Fireship

person Omer    schedule 23.09.2020
comment
интересный пакет, и можно ли его использовать как альтернативу общим настройкам? - person Asmoun; 23.09.2020