我们想在一些异步处理(例如网络进程)之后显示一个 AlertDialog。
从外部类调用“showAlertDialog()”时,我想在没有上下文的情况下调用它。有什么好办法吗?
class SplashPage extends StatelessWidget implements SplashView {
BuildContext _context;
@override
Widget build(BuildContext context) {
this._context = context;
...
}
Run Code Online (Sandbox Code Playgroud)
我已经考虑过上述方法,但我担心附带问题。
帮助
class SplashPage extends StatelessWidget implements SplashView {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: MyStoreColors.eats_white1_ffffff,
body: Center(
child: new SvgPicture.asset('assets/ic_splash.svg'),
),
);
}
@override
void showAlertDialog() {
showDialog<void>(
context: /*How to get context?*/,
builder: (BuildContext context) {
return AlertDialog(
title: Text('Not in stock'),
content: const Text('This item is no longer available'),
actions: <Widget>[
FlatButton( …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习 flutter,我使用 Stateful widget 下面的代码是 main.dart 文件
void main() {
runApp(App());
}
class App extends StatefulWidget {
@override
_AppState createState() => _AppState();
}
class _AppState extends State<App> {
@override
Widget build(BuildContext context) {
// TODO: implement build
return MaterialApp(
home: new Scaffold(backgroundColor: Colors.blueGrey.shade100,
body: Home.Homescreen(HomeText: "default",), //initially setting text to default
appBar: new AppBar(
centerTitle: true,
title: new Text("newApp",
textDirection: TextDirection.ltr,
style: TextStyle(fontSize:20 ,color: Colors.white)),
),
bottomNavigationBar: new BottomNavigationBar(items: [
new BottomNavigationBarItem(
icon: Icon(Icons.home),
title: new Text(
"Home",
textDirection: TextDirection.ltr, …Run Code Online (Sandbox Code Playgroud) 我知道这StatefulWidget可以让我们改变小部件,而StatelessWidget不是.
但是,如果StatefulWidget能够执行,一切都StatelessWidget可以执行更多精彩内容,为什么我会永远使用StatelessWidget过StatefulWidget?
是StatelessWidget的,反正以外,它更容易实现更好吗?
我目前正在按照教程开发一个待办事项应用程序,这是复选框部分
我试图将它的状态提升到树上,但是当我这样做时,无状态小部件只是不停地重建,我尝试添加key,添加const将其转换为有状态,但似乎没有任何作用,它也没有为我提供任何类型的错误或异常消息
注意:当我将onChecked设置为null时,statelessWidget 会运行两次,而它应该只构建一次。
下面是代码:
导入“包:flutter/material.dart”;
类 TaskTile 扩展 StatefulWidget {
@覆盖
_TaskTileState createState() => _TaskTileState();
}
类 _TaskTileState 扩展状态 {
布尔 isChecked = false;
@覆盖
小部件构建(BuildContext上下文){
返回列表图块(
标题:文字(
“完整的托多伊”,
样式:文本样式(
装饰: isChecked == true
?TextDecoration.lineThrough
: TextDecoration.none),
),
尾随:TaskCheckBox(
checkBoxState: 已选中,
切换复选框状态:
(布尔复选框状态){
Future.delayed(持续时间.0,
() 异步 {
设置状态((){
打印(
“==================$isChecked==============$checkBoxState============ ================================================================================================================================================================================
isChecked = checkBoxState;
});
});
}),
);
}
}
类 TaskCheckBox 扩展 StatelessWidget {
常量任务复选框(
{钥匙?钥匙,
需要 this.checkBoxState, … 该课程StatelessWidget标记为immutable。不过,我现在用的scoped model,这意味着,我尽量避免StatefulWidget和使用model来改变state在StatelessWidget。这导致我non-final fields进入StatelessWidget,这不是原因errors,因为它只是一个warning。但是我想知道是否有更好的方法?
我正在处理后面的 Flutter 代码。我对名为“Regitrese”的第二个按钮有疑问。我看过的每个地方都使用 statelesswidgets,所以我不知道如何解决它。我尝试更改 void 以将其放在 home: MyHomePage() 并将 MyHomePage 置于 statefull 而不是从 MyApp bus 中获取 statefull 它显示了一个错误 Missing specific implementation of StatefulWidget.createState。我不确定它应该怎么走。你能让一个按钮在 StatefulWidget 中工作吗?有什么我没有看到的技巧吗?
void main()=> runApp(new MyApp());
class MyApp extends StatefulWidget{
@override
State<StatefulWidget> createState(){
return new MyHomePage();
}
}
class MyHomePage extends State<MyApp>{
final TextEditingController rutController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
var _rut, _password;
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
body: new Container(
padding: const EdgeInsets.all(50.0),
child: new Column(
mainAxisAlignment: MainAxisAlignment.center, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用带有图像的卡片制作一个列表,想法是这些卡片将来会通过 API 请求动态生成,但现在我只想从图像开始,但是当我运行时,我有以下内容错误 :
“列表”类型不是“列表”类型的子类型
请问怎么解决啊,求帮助。
我的代码在一个名为:
请求.dart
这是我的代码:
import 'package:flutter/material.dart';
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return new MaterialApp(
home:new MyCard()
);
}
}
class MyCard extends StatelessWidget{
List cards = new List.generate(20, (i)=>new CustomCard());
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Car Results'),
backgroundColor:new Color(0xFF673AB7),
),
body: new Container(
child: new ListView(
children: cards,
)
)
);
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个StatelessWidget使用 aScopedModel来存储其数据的。该小部件基本上呈现了复选框列表和一些用于保存复选框状态的按钮。
现在我想跟踪用户是否更改了任何复选框,即自显示小部件以来选中/取消选中它们。所以我添加了这样的内容:
class MyCheckboxScreen extends StatelessWidget{
bool _hasBeenModified = false;
void _itemCheckedChange(bool checked, MyModel model){
_hasBeenModified = true;
// Code to change the model here
}
void _onCloseButton(){
if( _hasBeenModified ){
// Show a warning that there are modifications that will not be be saved
}
}
void _onSaveButton(Context context, MyModel model){
model.save();
Navigator.of(context).pop();
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我的StatelessWidgetnow 包含它自己的状态。
该状态不用于更新 UI 和重绘任何内容,它仅用于在按下“关闭”按钮时检查任何复选框是否有修改。
StatelessWidgeta拥有这种内部状态安全吗?或者这可能是一个问题?例如,小部件是否会意外重新创建,并且内部状态丢失?
我发现文档对此不是很清楚,它只是说
对于可以动态更改的组合,例如由于具有内部时钟驱动状态或取决于某些系统状态,请考虑使用 StatefulWidget。
但这听起来似乎只适用于影响 UI 并需要重建小部件的状态。
容器高度设置为固定 40,但是一旦我在 AppBar() 中使用该小部件,它就会采用所有可能的高度。这是我的自定义小部件的代码,它具有固定的容器高度,
class LPBorderButtonWithIcon extends StatelessWidget {
final GestureTapCallback onPressed;
final String text;
final String iconAsset;
final Color textColor;
LPBorderButtonWithIcon(
{@required this.onPressed,
@required this.text,
@required this.textColor,
@required this.iconAsset});
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: onPressed,
child: Container(
height: 40,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(25),
border: Border.all(color: Color(0XFFd8dce1))),
child: Row(
children: [
WidthSizedBox(15),
Image.asset(
iconAsset,
height: 14,
width: 14,
),
WidthSizedBox(5),
Text(text,
style: TextStyle(
color: textColor,
fontSize: 12,
fontFamily: "GilroyMedium")),
WidthSizedBox(15),
],
),
));
}
}
Run Code Online (Sandbox Code Playgroud)
LPBorderButtonWithIcon()我在这个屏幕中使用, …
我试图使用构造函数参数传递一个函数,但它向我显示了标题中提到的错误。
import 'package:flutter/material.dart';
class TaskTile extends StatefulWidget {
@override
_TaskTileState createState() => _TaskTileState();
}
class _TaskTileState extends State<TaskTile> {
bool isChecked = false;
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(
'This is a task',
style: TextStyle(
decoration: isChecked ? TextDecoration.lineThrough : null,
),
),
trailing: TaskCheckbox(
checkboxState: isChecked,
toggleCheckboxState: (bool checkboxState) {
setState(() {
isChecked = checkboxState;
});
},
),
);
}
}
class TaskCheckbox extends StatelessWidget {
final bool checkboxState;
final Function toggleCheckboxState;
TaskCheckbox(
{required this.checkboxState, required …Run Code Online (Sandbox Code Playgroud) 我在 VS Code 中安装了Awesome Flutter Snippets和Flutter Snippets扩展。当我安装这两个扩展时,我可以使用一些键盘快捷键来生成小部件。
当我在代码中输入statelessW或并按 Enter 键时,它会生成如下所示:stlessStatelessWidget
statelessW:
class name extends StatelessWidget {
const name({super.key});
@override
Widget build(BuildContext context) {
return Container();
}
}
Run Code Online (Sandbox Code Playgroud)
stless:
class MyWidget extends StatelessWidget {
const MyWidget({super.key});
@override
Widget build(BuildContext context) {
return Container();
}
}
Run Code Online (Sandbox Code Playgroud)
可以看到上面两段代码是一样的,两段代码都使用({super.key});而不是({Key? key}) : super(key: key);.
是否建议在 Flutter 中使用({super.key});而不是使用({Key? key}) : super(key: key);?我将不胜感激任何帮助。先感谢您!
flutter ×11
statelesswidget ×11
dart ×5
android ×2
button ×1
immutability ×1
listview ×1
setstate ×1
state ×1