跨路由共享用户定义的配置数据

时间:2019-06-19 04:46:46

标签: flutter state-management

我正在创建一个应用程序,该应用程序在初次启动时会询问用户一系列问题,询问与远程服务器的连接详细信息。答案存储在SharedPreferences中。让我们称之为设置流程。

所有问题填写完毕并存储后,应用程序将继续进行主要活动。在主要活动期间,用户输入的数据用于创建网络客户端。让我们将其称为主要流程。

在设置流程中,提出了N个问题,每个问题都在不同的路径上。想象一个FloatingActionButton的值为onPressed,它的值为Navigator.push(context, MaterialPageRoute(builder: (context) => nextQuestion())。我正在建立一整齐的路线。

我的runApp外观带有一个在构建时返回MaterialApp的小部件:

class MyApp extends StatelessWidget {
  @override
  Widget build(context) {
    return MaterialApp(
       home: ...
    );
  }
}

传递到home的{​​{1}}字段的值取决于状态。如果一切正常,则显示主流程,否则,则不显示设置流程。

“良好”定义为回答的完整问题和服务器的活动检查(位置根据给出的答案)。这是MaterialApp操作。

在主流中,我想定期引用生成的网络客户端。因此,我引入了一个async派生的InheritedWidget小部件,并将其放在树中Data之前:

MaterialApp

现在我可以做典型的class MyApp extends StatelessWidget { MyApp(this.preferences, this.networkClient); final SharedPreferences preferences; final NetworkClient networkClient; @override Widget build(context) { return Data( preferences: preferences, networkClient: networkClient, child: MaterialApp( home: ... ); } }

我真的有两个问题;

  1. 如何路由到正确的路线?
  2. 如何更新Data.of(context).networkClient

对于第一个问题,我创建了一个networkClient类,其上带有一个签名为Routing的方法。然后,分配给static Future<Widget> next() async {}的值将成为home,并且在FutureBuilder中分配了Future。我不确定这是正确的方法。

对于第二个问题,我不知道。 initState是不可变的。修改InheritedWidget字段是可行的,因为它或多或少是SharedPreferences。但是Map最初是networkClient。我无法重新分配。

这个问题感觉很基本,但我正在努力。

0 个答案:

没有答案
相关问题