如何在从另一个小部件继承的小部件中设置数据?
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));
【讨论】:
以上是关于如何在从另一个小部件继承的小部件中设置数据?的主要内容,如果未能解决你的问题,请参考以下文章