gpt4 book ai didi

dart - 局部变量的问题 - 全局变量 flutter dart

转载 作者:IT王子 更新时间:2023-10-29 07:12:19 28 4
gpt4 key购买 nike

我想在使用 BottomAppBar 时通过不同的页面传递动态数据。我目前在页面/小部件之间切换,我这样存储它们:

  @override
void initState() {
super.initState();
final _pageOptions = [
SwipeScreen(currentUserId: currentUserId),
Requests(currentUserId: currentUserId),
Messages(currentUserId: currentUserId),
Settings(),
];}

然后我在我的 Scaffold 中使用 _pageOptions:

  body: _pageOptions[_selectedPage],
bottomNavigationBar: BottomNavigationBar(
currentIndex: _selectedPage,
onTap: (int index) {
setState(() {
_selectedPage = index;
});
},

您可能已经猜到了,我不能将 _pageOptions 用作我的 Scaffold 中的主体,因为它是包裹在 initState 中的局部变量()。不过我必须使用这个 initState,因为没有它,我只能在我的初始化器中传递静态成员。

我不知道如何解决这个问题,因为删除一个只会给我一个不同的错误。我一直在寻找使变量成为全局变量的方法,例如将 _pageOptions 放在不同的文件中,但它仍然是本地的,因此在我的 Scaffold 中使用时未定义.

我希望我的问题很清楚。

提前致谢。

最佳答案

这并不是刻薄,只是诚实所以请不要生气,但是从事物的声音开始,您需要从一些关于 flutter 如何工作以及如何在 flutter 中开发东西的基本教程重新开始.我建议完成几个 tutorials & codelabs在 flutter 网站上从头到尾(直到你不看最终代码)然后看看你做了什么与他们不同的事情。甚至可能是 getting started with Dart documentation ...

解决您的问题的最简单方法是将 _pageOptions 设为类的成员变量,这样您就可以从任何需要的地方访问它。但是由于您遇到了只能“在我的初始化程序中传递静态成员”的问题,这可能意味着您没有在正确的地方初始化东西。

在使用 flutter 进行开发时需要注意以下几点:

  1. 除了构建函数之外,您不应该在任何地方创建小部件(除非您创建一个从构建函数调用的辅助函数 - 但如果您这样做,可能是因为小部件变得越来越大,您应该将其拆分到它自己的有状态或无状态小部件中)
  2. 除非您知道自己在做什么,否则不应继承小部件。大多数时候你只会继承 StatelessWidget 和 StatefulWidget,其他一切都是通过封装完成的(即在构建函数中使用它们)
  3. 通过更改您使用数组构建的内容来简单地切换页面并不是一个很好的方法 - 导航时您不会获得动画之类的东西,您可能会比需要更快地构建东西,并失去诸如页面状态,除非您对操作方式非常小心。
  4. 在 flutter 中构建小部件的成本很低,您通常应该为每个页面构建其中的大部分。在某些情况下情况并非如此,但对于基本应用程序,为每个屏幕构建导航栏(但构建它的实际逻辑拆分为无状态或有状态小部件!)

#3 的解决方案是使用 flutter's navigation并在 MaterialApp(routes: ...)MaterialApp(onGenerateRoute: ...) 中定义您的页面。因此,您需要为 SwipeScreen、Requests、Messages 和 Settings 设置路由。您将使用 Navigator.pushNavigator.pushNamedNavigator.pop 在它们之间移动。

为了避免在各处复制和粘贴底部导航栏,请将其拆分为自己的小部件,即 MyBottomNavigationBar extends StatelessWidget。然后在每个页面中都有一个 Scaffold(body: ..., bottomNavigationBar: MyBottomNavigationBar())。如果您的脚手架变得非常复杂,您甚至可以将其移动到自己的小部件中。

哦,我刚刚阅读了可能是您问题的重要部分的内容:我想通过不同的页面传递动态数据。使用我描述的导航器会稍微改变这一点,因为您不想将它传递到构建的每一层。

有多种方法可以解决这个问题 - 最基本的方法是使用 InheritedWidget,但由于它需要大量样板文件才能使其工作,我建议使用 ScopedModel .这样,您只需创建一个从 Model 继承的类(即 UserModel),然后更改模型中的信息并在选择/登录用户时通知监听器(即 userId)。像这样:

class UserModel extends Model {
String _userId;

String get userId => _userId;

void setUser(String userId) {
_userId = userId;
notifyListeners();
}

static CounterModel of(BuildContext context, {bool rebuildOnChange = false}) =>
ScopedModel.of<CounterModel>(context, rebuildOnChange = rebuildOnChange);
}

您需要将它放在小部件树中较高的位置(可能在 MaterialApp 之上或 MaterialApp(builder: ...) 中)。然后您可以向该模型添加名称、配置文件、颜色等,并在您的应用程序中的任何需要的地方使用所有这些。

关于dart - 局部变量的问题 - 全局变量 flutter dart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55031185/

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