如何在颤动中将数据从一个小部件传递到另一个小部件?

Posted

技术标签:

【中文标题】如何在颤动中将数据从一个小部件传递到另一个小部件?【英文标题】:How i can pass Data from one widget to another widget in flutter? 【发布时间】:2020-08-08 09:55:15 【问题描述】:

我想将数据从一个小部件传递到另一个小部件。 我正在从 firebase 获取数据,我希望通过小部件传递该数据。 如何将数据从一个屏幕传递到另一个屏幕。 这就是我的代码的样子。

class Home extends StatefulWidget 
  @override
  _HomeState createState() => _HomeState();


class _HomeState extends State<Home> 
  int _currentindex = 0;
  final List<Widget> _children = [
    Dashboard(),
    Search(),

  ];

  void onTappedBar(int index) 
    setState(() 
      _currentindex = index;
    );
  

  @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 return Scaffold(
      backgroundColor: Color(0xFFf6f5fb),
      body: _children[_currentindex],
      bottomNavigationBar: CurvedNavigationBar(
        onTap: onTappedBar,
        index: _currentindex,
        items: <Widget>[
          Icon(
            Icons.home,
          ),
          Icon(
            Icons.search,     
        ],
      ),
    );
        );
  


从此小部件中,数据从 firebase 加载。现在我想将 snapshot.data 传递给 Dashboard() 小部件和 Search() 小部件。

我想显示用户名 Dashboard()。 这就是我的 ```Dashboard()`` 小部件的例子

class Dashboard extends StatefulWidget 
  @override
  _DashboardState createState() => _DashboardState();


class _DashboardState extends State<Dashboard> 
  @override
  Widget build(BuildContext context) 
    return Center(
      child: Text('Here i want display the 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 );



【问题讨论】:

【参考方案1】:

如果是像你这样的简单场景,请通过构造函数:

class Dashboard extends StatefulWidget 
  final UserData userData;

  // userData is not optional-named parameter
  const Dashboard(this.userData, Key key) : super(key: key);
  @override
  _DashboardState createState() => _DashboardState();


class _DashboardState extends State<Dashboard> 
  @override
  Widget build(BuildContext context) 
    final UserData userData = widget.userData;//do something with user
    return Center(
        child: Text('user is $user.username')
    ),
    );
  

HomeState(不要将小部件保存为类的字段,动态创建它们):

class _HomeState extends State<Home> 
  int _currentindex = 0;

  void onTappedBar(int index) 
    setState(() 
      _currentindex = index;
    );
  

  @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  Scaffold(
    backgroundColor: Color(0xFFf6f5fb),
    body: Column(
               children: [
                 Dashboard(userData),
                 Search(userData),
                 ],
    ),
    bottomNavigationBar: CurvedNavigationBar(
    onTap: onTappedBar,
    index: _currentindex,
    items: <Widget>[
    Icon(
    Icons.home,
    ),
    Icon(
    Icons.search,
    ],
    ),
    );
    );
    
  

【讨论】:

@Lucii 查看已编辑的答案,如果它回答了您的问题,则将其标记为 true :) 我收到一条错误消息 没有为类“_HomeState”定义方法“_Column”。尝试将名称更正为现有方法的名称,或定义名为“_Column”的方法。 @Lucii 这是答案中的错字,也不要复制答案,这样重写它你会看到你的问题是什么 我是编码新手,也是这里的新手。谢谢它醒了。

以上是关于如何在颤动中将数据从一个小部件传递到另一个小部件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中将Json数据传递到多屏

如何从有状态的小部件类传递变量? - 颤动[重复]

如何在颤动中将 ListTile 连接到音频小部件

如何在颤动中加载主小部件之前显示加载小部件?

页面浏览量颤动如何跳转到另一个页面

如何根据列表中的数据在颤动中渲染多个小部件?