gpt4 book ai didi

flutter - 当我渲染我的子 Material 应用程序时,如何阻止我的更改通知程序提供程序重建我的父 Material 应用程序?

转载 作者:行者123 更新时间:2023-12-03 02:48:47 27 4
gpt4 key购买 nike

我有一个返回 MaterialApp() 的应用程序类它的家设置为 TheSplashPage() .如果任何首选项发生更改,此应用程序会监听首选项通知程序。

然后在 TheSplashPage()我等待某些条件成立,如果成立,我会向他们展示我的嵌套 Material 应用程序。

旁注 :我在这里使用 Material 应用程序,因为它看起来更合乎逻辑,因为它具有父 Material 应用程序不应该具有的路由。而且一旦用户未经身份验证或断开连接,我希望整个嵌套应用程序关闭并显示另一个页面。这很好用!

但我的问题如下。两个应用都听 ThePreferencesProvider()所以当主题改变时,他们都会得到通知并重建。但这是一个问题,因为每当父 Material 应用程序重建时,它都会返回启动页面。所以现在我回到 TheSplashPage()每当我更改 TheSettingsPage() 上的设置时.

所以我的问题是如何阻止我的应用程序返回到 TheSplashPage()每当我更改设置时?

Main.dart

void main() {
runApp(App());
}

class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIOverlays([]);

return MultiProvider(
providers: [
ChangeNotifierProvider<PreferencesProvider>(create: (_) => PreferencesProvider()),
ChangeNotifierProvider<ConnectionProvider>(
create: (_) => ConnectionProvider(),
),
ChangeNotifierProvider<AuthenticationProvider>(create: (_) => AuthenticationProvider()),
],
child: Consumer<PreferencesProvider>(builder: (context, preferences, _) {
return MaterialApp(
home: TheSplashPage(),
theme: preferences.isDarkMode ? DarkTheme.themeData : LightTheme.themeData,
debugShowCheckedModeBanner: false,
);
}),
);
}
}

TheSplashPage.dart
class TheSplashPage extends StatelessWidget {
static const int fakeDelayInSeconds = 2;

@override
Widget build(BuildContext context) {
return FutureBuilder(
future: Future.delayed(new Duration(seconds: fakeDelayInSeconds)),
builder: (context, delaySnapshot) {
return Consumer<ConnectionProvider>(
builder: (BuildContext context, ConnectionProvider connectionProvider, _) {

if (delaySnapshot.connectionState != ConnectionState.done ||
connectionProvider.state == ConnectionStatus.uninitialized) return _buildTheSplashPage(context);

if (connectionProvider.state == ConnectionStatus.none) return TheDisconnectedPage();

return Consumer<AuthenticationProvider>(
builder: (BuildContext context, AuthenticationProvider authenticationProvider, _) {
switch (authenticationProvider.status) {
case AuthenticationStatus.unauthenticated:
return TheRegisterPage();
case AuthenticationStatus.authenticating:
return TheLoadingPage();
case AuthenticationStatus.authenticated:
return MultiProvider(
providers: [
Provider<DatabaseProvider>(create: (_) => DatabaseProvider()),
],
child: Consumer<PreferencesProvider>(
builder: (context, preferences, _) => MaterialApp(
home: TheGroupManagementPage(),
routes: <String, WidgetBuilder>{
TheGroupManagementPage.routeName: (BuildContext context) => TheGroupManagementPage(),
TheGroupCreationPage.routeName: (BuildContext context) => TheGroupCreationPage(),
TheGroupPage.routeName: (BuildContext context) => TheGroupPage(),
TheSettingsPage.routeName: (BuildContext context) => TheSettingsPage(),
TheProfilePage.routeName: (BuildContext context) => TheProfilePage(),
TheContactsPage.routeName: (BuildContext context) => TheContactsPage(),
},
theme: preferences.isDarkMode ? DarkTheme.themeData : LightTheme.themeData,
debugShowCheckedModeBanner: false,
)),
);
}
});
});
});
}

TheSettingsPage.dart
Switch(
value: preferences.isDarkMode,
onChanged: (isDarkmode) => preferences.isDarkMode = isDarkmode,
),

最佳答案

你陷入了 XY 问题

这里真正的问题不是“我的小部件重建太频繁”,而是“当我的小部件重建时,我的应用程序返回到启动页面”。

解决方案不是阻止重建,而是更改您的 build方法来解决问题,这是我之前在此处详细介绍的内容:How to deal with unwanted widget build?

您遇到了与交叉链接问题相同的问题:您误用了 FutureBuilder .

不要 :

@override
Widget build(BuildContext context) {
return FutureBuilder(
// BAD: will recreate the future when the widget rebuild
future: Future.delayed(new Duration(seconds: fakeDelayInSeconds)),
...
);
}

:

class Example extends StatefulWidget {
@override
_ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
// Cache the future in a StatefulWidget so that it is created only once
final fakeDelayInSeconds = Future<void>.delayed(const Duration(seconds: 2));

@override
Widget build(BuildContext context) {
return FutureBuilder(
// Rebuilding the widget no longer recreates the future
future: fakeDelayInSeconds,
...
);
}
}

关于flutter - 当我渲染我的子 Material 应用程序时,如何阻止我的更改通知程序提供程序重建我的父 Material 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61079815/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com