如何在从另一个小部件继承的小部件中设置数据?

Posted

技术标签:

【中文标题】如何在从另一个小部件继承的小部件中设置数据?【英文标题】:How to set data in an inherited widget from a another widget? 【发布时间】:2021-04-03 15:17:55 【问题描述】:

所以继承的小部件对于将数据向下传递树很有用,但是如果继承的小部件是不可变的,我如何首先设置该数据? 我正在尝试为 OTP 身份验证设置一个电话号码,然后在另一个屏幕上显示该号码。提供商目前对我来说有点先进,我该如何处理? 谢谢你

【问题讨论】:

【参考方案1】:

首先,您将使用StreamProvider 作为数据流(与使用 StreamBuilder 相同):

class Widget1 extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return StreamProvider<User>.value(
      value: AuthService().user,
      child: Wrapper(),
    );
  

下一个小部件没有必需的数据

class Widget2 extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Container(
      child: Widget3(),
    );
  

通过Provider.of访问您的数据

class Widget3 extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    final user = Provider.of<User>(context);
    if (user == null) 
      return Login();
     else 
      return Dashboard();
    
  

使用此方法,您仍然需要访问小部件树下某处的数据。你不能上去,如果你想让一个小部件在树上听听树下发生的事情,你会想看看ChangeNotifier

【讨论】:

【参考方案2】:

你必须在某个地方重建你的InheritedWidget。 你可以为它使用任何舞台管理,例如你可以使用StatefulWidget:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class MyInheritedWidget extends InheritedWidget 
 final int counter;

 MyInheritedWidget(Key key, this.counter, Widget child)
     : super(key: key, child: child);

 @override
 bool updateShouldNotify(MyInheritedWidget oldWidget) 
   return oldWidget.counter != counter;
 

 static MyInheritedWidget of(BuildContext context) 
   return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
 


void main() 
 runApp(MyApp());


class MyApp extends StatelessWidget 
 @override
 Widget build(BuildContext context) 
   return MaterialApp(
     home: Home(),
   );
 


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


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

 @override
 Widget build(BuildContext context) 
   return Scaffold(
     body: Center(
       child: MyInheritedWidget(counter: _counter, child: CounterWidget()),
     ),
     floatingActionButton: FloatingActionButton(
       onPressed: () 
         setState(() 
           _counter++;
         );
       ,
     ),
   );
 


class CounterWidget extends StatelessWidget 
 @override
 Widget build(BuildContext context) 
   return Text("$MyInheritedWidget.of(context).counter",
       style: TextStyle(fontSize: 100));
 

【讨论】:

以上是关于如何在从另一个小部件继承的小部件中设置数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在从另一个小部件拖放事件期间突出显示表格单元格

如何在android中正确设置一个大的小部件图标

如何从另一个窗口访问一个窗口的小部件?

从另一个文件中的按钮切换 QStackedWidget 中的小部件

如何从另一个小部件状态处理一个小部件状态?

Dojo Dijit - 小部件中的小部件