Dart3通过路由系统获取集合中的文档

gwbalxhn  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(85)

我试图通过路由系统获得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;
  }
}


定义一个页面调用我的小部件,所以我被阻止了。
请帮帮我谢谢你抽出时间

6kkfgxo0

6kkfgxo01#

您的generate()方法是同步的,因此它将一直执行到使用page局部变量的return语句。传递给then()的Continuation函数将仅在generate()完成后执行。
在switch语句中,pagedefault情况下是明确赋值的。但在另一种情况下,page只会在传递给then()的函数执行时(在未来的commonService.terms完成之后--即使未来已经完成)才被赋值。由于在达到return之前不会发生这种情况,因此在这种情况下,page保持未分配。
您可以通过基于commonService.terms未来为page分配FutureBuilder<T>来解决此问题。当这个future完成时,构建器应该返回预期的TermsScreen。同时,它应该提供另一个Widget,例如CircularProgressIndicator

case RouteConsts.termsScreen:
      ArgumentsAuth args = s.arguments as ArgumentsAuth;
      page = FutureBuilder<String>(
         future: commonService.terms,
         builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
            if (snapshot.hasData) {
               return TermsScreen(email: args.email, terms: snapshot.data!);
            } else {
               return /* some widget shown until terms completes */;
            }
         }
      );
      break;

字符串

相关问题