flutter - 将数据从一个类传递到另一个类 - Flutter
问题描述
我有一个列表生成器,它根据 Firestore 中列出的文档创建一个列表。我正在尝试获取从 Firestore 快照生成的值,并将其从类中传递给一个变量,每次用户从 List Builder 中单击不同的条目时,该变量都会更新。这是进行 Firestore 交互并返回 ListBuilder 的类:
class DeviceBuilderListState extends State<DeviceBuilderList> {
final flutterWebviewPlugin = new FlutterWebviewPlugin();
@override
void initState() {
super.initState();
// Listen for our auth event (on reload or start)
// Go to our device page once logged in
_auth.onAuthStateChanged
.where((user) {
new MaterialPageRoute(builder: (context) => new DeviceScreen());
});
// Give the navigation animations, etc, some time to finish
new Future.delayed(new Duration(seconds: 1))
.then((_) => signInWithGoogle());
}
void setLoggedIn() {
_auth.onAuthStateChanged
.where((user) {
Navigator.of(context).pushNamed('/');
});
}
@override
Widget build(BuildContext context) {
return new FutureBuilder<FirebaseUser>(
future: FirebaseAuth.instance.currentUser(),
builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
if (snapshot.data != null)
return new StreamBuilder(
stream: Firestore.instance
.collection('users')
.document(snapshot.data.uid)
.collection('devices')
.snapshots,
builder: (context, snapshot) {
if (!snapshot.hasData)
return new Container();
return new Container(
margin: const EdgeInsets.symmetric(vertical: 10.0),
child: new ListView.builder(
itemCount: snapshot.data.documents.length,
padding: const EdgeInsets.all(10.0),
itemBuilder: (context, index) {
DocumentSnapshot ds =
snapshot.data.documents[index];
return new Card(
child: new GestureDetector(
onTap: () {
var initialStateLink = "${ds['name']}";
Navigator.of(context).pushNamed("/widget");
},
child: new Text(
" ${ds['name']}",
style: new TextStyle(fontSize: 48.0),
),
));
}),
);
},
);
else return new Container();
}
);}
}
然后我想将 var initialStateLink 发送到同一个 dart 文件中的不同函数:
Future<String> initialStateUrl() async {
final FirebaseUser currentUser = await _auth.currentUser();
Firestore.instance.collection('users')
.document(currentUser.uid).collection('devices').document(initialStateLink).get()
.then((docSnap) {
var initialStateLink = ['initialStateLink'];
return initialStateLink.toString();
});
return initialStateUrl().toString();
}
以便它返回正确的字符串。我对如何做到这一点完全不知所措,我无法找到另一个回答这个问题的问题。感谢您的想法。
解决方案
您可以使用Navigator.push(Route route)
而不是Navigator.pushNamed(String routeName)
而且我不鼓励您将导航代码深入到小部件树中,很难维护您的应用程序流逻辑,因为您最终会在许多类中获得许多导航代码。我的解决方案是将导航代码放在一个地方(一类)。让我们称之为它AppRoute
,它看起来像:
class AppRoute {
static Function(BuildContext, String) onInitialStateLinkSelected =
(context, item) =>
Navigator.of(context).push(
new MaterialPageRoute(builder: (context) {
return new NewScreen(initialStateLink: initialStateLink);
}
));
}
并替换您的代码onTap
:
onTap: () {
var initialStateLink = "${ds['name']}";
AppRoute.onInitialStateLinkSelected(context, initialStateLink);
}
现在,您不仅可以将数据从类传递到另一个类,还可以轻松控制您的应用程序流程(只需查看AppRoute
类)
推荐阅读
- azure - Azure 应用服务 - 部署中心 - 比特桶账户更改不起作用
- opencv - 用于opencv问题的覆盆子相机模块驱动程序
- javascript - 通过Javascript获取客户端本地IP地址
- laravel - laravel 聊天机器人集成在自定义网站中
- java - 从 jsp 调用 servlet 中的方法
- python - Python Django 模板中未加载一些静态图像
- memory-management - TLB 是否仅包含单个进程的条目?
- android - 如何解决 Android 应用程序的 audeince 网络中的质量检查问题?
- ios - FileManager.enumerator 在 ios 设备上测试时返回 nil
- javascript - D3图表图例标签重叠