为什么在这里使用StatelessWidget可以正常工作?

时间:2020-04-25 22:14:45

标签: flutter dart

今天刚开始玩飞镖和飞镖。我试图完全掌握基本知识,但无法理解为什么以下方法会很好:

String encodedFile = Base64.getEncoder().encodeToString(bytes);

documentation中,他们使用的是import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { final appTitle = 'Form Validation Demo'; return MaterialApp( title: appTitle, home: Scaffold( appBar: AppBar( title: Text(appTitle), ), body: MyCustomForm(), ), ); } } class MyCustomForm extends StatelessWidget { final _formKey = GlobalKey<FormState>(); final _textKey = GlobalKey<FormFieldState<String>>(); @override Widget build(BuildContext context) { return Form( key: _formKey, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ TextFormField( key: _textKey, validator: (value) { if (value.isEmpty) { return 'Please enter some text'; } return null; }, ), Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), child: RaisedButton( onPressed: () { if (_formKey.currentState.validate()) { Scaffold.of(context) .showSnackBar(SnackBar(content: Text(_textKey.currentState.value))); } }, child: Text('Submit'), ), ), ], ), ); } } StatefulWidget,而我只是在使用State。有StatelessWidget在这种情况下起作用的原因,为什么我们应该使用StatelessWidget

2 个答案:

答案 0 :(得分:2)

没有义务使用有状态的小部件。您决定自己的班级是否需要扩展有状态的小部件或无状态的小部件。

当您确定班级中的数据将发生更改并且需要重建UI(如flutter hello world应用程序)时,将使用有状态小部件。 另一方面,当您知道您的班级不会更改UI(例如带有单个图像的初始屏幕)时,将使用无状态小部件。

在此示例中,两者都可以完美地完成工作。数据没有变化,因此可以使用无状态,也可以使用有状态。

详细了解stateful widgetsstateless widgets以及状态管理的其他解决方案

答案 1 :(得分:1)

Form类是StatefulWidget

注意继承:

Object> Diagnosticable> DiagnosticableTree> Widget> StatefulWidget> Form

此示例中的所有有状态工作都包含在Form的范围内。

如果您想在部分MyCustomForm内但在Form外部保持状态,则必须将MyCustomForm更改为StatefulWidget