我正在创建一个应用程序,该应用程序在初次启动时会询问用户一系列问题,询问与远程服务器的连接详细信息。答案存储在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: ...
);
}
}
!
我真的有两个问题;
Data.of(context).networkClient
? 对于第一个问题,我创建了一个networkClient
类,其上带有一个签名为Routing
的方法。然后,分配给static Future<Widget> next() async {}
的值将成为home
,并且在FutureBuilder
中分配了Future
。我不确定这是正确的方法。
对于第二个问题,我不知道。 initState
是不可变的。修改InheritedWidget
字段是可行的,因为它或多或少是SharedPreferences
。但是Map
最初是networkClient
。我无法重新分配。
这个问题感觉很基本,但我正在努力。