Как передать данные с экрана на экран? - PullRequest
1 голос
/ 24 апреля 2020

Как я могу передавать данные из одного виджета в другой виджет. Я получаю данные из Firebase и хочу передать эти данные через виджет. как я не могу это сделать.

Например, для этого я получаю данные из этого виджета

class _SettingState extends State<Setting> {
  final AuthService _auth = AuthService();
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<User>(context);
    return StreamBuilder<UserData>(
        stream: DatabaseService(uid: user.uid).userData,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            UserData userData = snapshot.data;
            return Column(
              children: <Widget>[
                Container(
                 child: Text('working)
                )
               ]

            );
          } 
        });
  }
}

Теперь я хочу передать данные в этот виджет

class Inbox extends StatefulWidget {
  @override
  _InboxState createState() => _InboxState();
}

class _InboxState extends State<Inbox> {
  final AuthService _auth = AuthService();

  @override
  Widget build(BuildContext context) {
    return Center(
        child: Text('Data'),
      ),
    );
  }
}

Вот модель класса

class User {
  final String uid;

  User({this.uid});
}

class UserData {

  final String uid;
  final String username;
  final String phonenumber;


  UserData({ this.uid, this.username, this.phonenumber });


Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

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

Документация для этого же здесь

----- Экран, на котором у вас есть данные- -----

ListView.builder(
  itemCount: todos.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(todos[index].title),
      // When a user taps the ListTile, navigate to the DetailScreen.
      // Notice that you're not only creating a DetailScreen, you're
      // also passing the current todo to it.
      onTap: () {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => DetailScreen(todo: todos[index]),
          ),
        );
      },
    );
  },
);

----- Экран, на котором необходимо передать данные ------

class DetailScreen extends StatelessWidget {
  // Declare a field that holds the Todo.
  final Todo todo;

  // In the constructor, require a Todo.
  DetailScreen({Key key, @required this.todo}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // Use the Todo to create the UI.
    return Scaffold(
      appBar: AppBar(
        title: Text(todo.title),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Text(todo.description),
      ),
    );
  }
}

Happy Coding !!!

0 голосов
/ 24 апреля 2020

Вы можете добавить параметр в виджет Inbox и использовать его в таком состоянии:

class Inbox extends StatefulWidget {
  final UserData userData;

  Inbox({Key key, this.userData}): super(key: key);

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

class _InboxState extends State<Inbox> {
  final AuthService _auth = AuthService();

  @override
  Widget build(BuildContext context) {
    return Center(
        child: Text(widget.userData.username),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...