Flutter Push 与状态相关视图

aks*_*ksn 0 flutter flutter-layout

有两种方法可以更改用户在显示上看到的内容:我可以推送到另一个页面,或者可以更改有状态小部件的状态并重建它。你能告诉我哪种方法是最佳实践吗?(如果这取决于——我猜——取决于什么?)

推动:

class Pushing extends StatelessWidget {

@override
Widget build(BuildContext context) {
return Scaffold(
  body: Center(
      child: RaisedButton(
        onPressed: () => Navigator.push(context, new MaterialPageRoute(builder: (context) => new SecondPage())),)
  ),
);
}
}
Run Code Online (Sandbox Code Playgroud)

使用状态

class UsingStates extends StatefulWidget {
@override
State createState() => new _UsingStatesState();
}

class _UsingStatesState extends State<UsingStates> {
 bool isPageTwo;

 @override
 void initState() {
  isPageTwo = false;
  super.initState();
 }

 @override
 Widget build(BuildContext context) {
 return Scaffold(
   body: isPageTwo ? Center(child: Text('Page two')) : Center(child: RaisedButton(onPressed: () {
    setState(() {
      isPageTwo = true;
    });
  })),
);
}
}
Run Code Online (Sandbox Code Playgroud)

bof*_*mer 5

答案当然是:视情况而定。

何时使用Navigator

使用导航器推送的路线在某种程度上相当于......

  • ActivityFragment在安卓中
  • Angular 或 React 中的路线
  • 一个经典网页的html文件

您可以使用Navigator在应用程序的逻辑上独立的部分之间进行切换。想象一下带有不同页面的 StackOverflow 应用程序,例如“问题列表”、“问题详细信息”、“提问”表单和“用户个人资料”。

Navigator负责后退导航(Android 手机上的硬件后退按钮 + 中的后退箭头AppBar

请注意,路线不必覆盖整个屏幕。showDialog也在内部使用Navigator.push()(这就是您用来Navigator.pop()关闭对话框的原因。

与 Android 类似,路由在被调用startActivityForResult时也可以返回结果。pop想象一个让您选择日期的对话框。

何时使用State

State当屏幕是逻辑单元时使用,例如:

  • 当您从服务器加载项目列表时,您将有 4 种不同的状态:
    • 加载中
    • “发生错误...”
    • 列表为空时显示的占位符
    • ListView
  • 具有多个步骤的表单
  • 具有多个选项卡的屏幕(在这种情况下,导航由选项卡栏处理)
  • POST当请求发送到服务器时,“请稍候”覆盖会阻塞屏幕

毕竟Navigator也是一个StatefulWidget记录路线历史的。有状态的 widget 是 Fl​​utter 的基本构建块。当您的应用程序非常复杂且Navigator无法满足您的需求时,您始终可以创建自己的应用程序StatefulWidget以实现完全控制。

查看 Flutter 的源代码(Android Studio 中的 CTRL + B)总是有帮助的。