我试图通过路由系统获得Future<>
函数的返回值。
我得到一个错误:
在使用不可为空的局部变量“page”之前,必须对其进行赋值
由我的类RouteGenerator
的返回引发。
我的RouteGenerator.dart
:
import 'package:chope_ton_diplome/services/CommonService.dart';
import 'package:flutter/material.dart';
class RouteGenerator {
static Route generate(RouteSettings s) {
Widget page;
CommonService commonService = CommonService();
switch (s.name) {
case RouteConsts.termsScreen:
ArgumentsAuth args = s.arguments as ArgumentsAuth;
commonService.terms.then((terms) =>
page = TermsScreen(email: args.email, terms: terms)
);
break;
default:
page = const Center(
child: Text('La route est inaccessible'),
);
break;
}
return MaterialPageRoute(builder: (context) => page);
}
}
字符串
下面是我的CommonService
:
import 'package:cloud_firestore/cloud_firestore.dart';
class CommonService {
final FirebaseFirestore firebaseFirestore = FirebaseFirestore.instance;
Future<String> get terms async {
String content = '';
DocumentReference documentReference = firebaseFirestore.collection('commons').doc('terms');
content = (await documentReference.get()).get('content');
return content;
}
}
型
定义一个页面调用我的小部件,所以我被阻止了。
请帮帮我谢谢你抽出时间
1条答案
按热度按时间6kkfgxo01#
您的
generate()
方法是同步的,因此它将一直执行到使用page
局部变量的return
语句。传递给then()
的Continuation函数将仅在generate()
完成后执行。在switch语句中,
page
在default
情况下是明确赋值的。但在另一种情况下,page
只会在传递给then()
的函数执行时(在未来的commonService.terms
完成之后--即使未来已经完成)才被赋值。由于在达到return
之前不会发生这种情况,因此在这种情况下,page
保持未分配。您可以通过基于
commonService.terms
未来为page
分配FutureBuilder<T>
来解决此问题。当这个future完成时,构建器应该返回预期的TermsScreen
。同时,它应该提供另一个Widget,例如CircularProgressIndicator
。字符串