我试过了FittedBox,也用 包裹了所有这些ConstrainedBox,但没有一个起作用。可能是我漏掉了一点。
问题也在:https : //github.com/flutter/flutter/issues/31911
这里的代码:
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
FittedBox(
fit: BoxFit.cover,
child: AspectRatio(
aspectRatio: _aspectRatio,
child: VideoPlayer(_playerController),
),
),
_buildText(),
],
);
}
Run Code Online (Sandbox Code Playgroud)
我想要的很简单,我想Stack在保留原始纵横比的同时全屏显示视频,我也想像BoxFit.cover.
错误日志:
I/flutter (11919): ??? EXCEPTION CAUGHT BY RENDERING LIBRARY ??????????????????????????????????????????????????????????
I/flutter (11919): The following assertion was thrown during performLayout():
I/flutter (11919): RenderAspectRatio has unbounded constraints.
I/flutter (11919): This RenderAspectRatio was given an aspect ratio of 0.5602409638554217 but was given both …Run Code Online (Sandbox Code Playgroud) 编辑:在这个新问题主题中完全按照我的要求解决了问题:
老问题:
这是我的启动屏幕,我想创建条件导航,但据我所知,FutureBuilder 没有导航逻辑。
这是我的启动屏幕构建方法:
@override
Widget build(BuildContext context) {
return Material(
child: ScopedModelDescendant<MainModel>(
builder: (BuildContext context, Widget child, MainModel model) {
return FutureBuilder(
future: model.bootUp(),
builder: (context, bootSnapshot) {
print('====${bootSnapshot.data} is SNAPSHOT DATA====');
return !bootSnapshot.hasData
? _buildSplash(context)
: bootSnapshot.data
? FutureBuilder(
future: model.fetchAll(model.tempUser),
builder: (context, dataSnapshot) {
return !dataSnapshot.hasData
? _buildSplash(context)
: Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => HomePage()),
);
})
: Navigator.of(context).pushReplacement(
MaterialPageRoute(
builder: (context) => FirstScreen(),
),
);
},
);
},
),
);
}
Run Code Online (Sandbox Code Playgroud)
正如您在代码中看到的,首先我检查用户是否使用异步方法登录,然后如果他之前登录,那么我正在获取与他相关的数据,一旦获取完成我想导航到用户主页。
错误日志:
I/flutter …Run Code Online (Sandbox Code Playgroud) 我之前问过但事情已经改变了,今天我意识到我之前得到的解决方案存在严重问题。我的算法有点改变。
这是新代码:
@override
Widget build(BuildContext context) {
return Material(
child: FutureBuilder(
future: _future,
builder: (context, snapshot) {
if (snapshot.hasData) {
print('BOOT VALUE IS ${snapshot.data}');
}
return !snapshot.hasData
? SplashScreen()
: snapshot.data ? HomePage() : FirstScreen();
},
),
);
}
Run Code Online (Sandbox Code Playgroud)
使用此解决方案,每次我在 FutureBuilder 内有条件地呈现的页面内导航时,都会执行 BootScreen 页面函数。所以这不是最好的......我需要在 Future Builder 中毫无问题地执行 Navigation,如下所示:
@override
Widget build(BuildContext context) {
return Material(
child: FutureBuilder(
future: _future,
builder: (context, snapshot) {
if (snapshot.hasData) {
print('BOOT VALUE IS ${snapshot.data}');
}
return !snapshot.hasData
? SplashScreen()
: snapshot.data
? Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: …Run Code Online (Sandbox Code Playgroud) 我一直致力于制作我的小部件,Stateless而不是Stateful为了性能优势。在某些情况下(BottomNavigationBar例如更新索引)notifyListeners()可以提供与setState().
起初,我认为notifyListener()与 相比setState(),它的级别较低,功能更基本,因此应该更高效。因为setState()方法可能会触发太多更高级别的framework方法,所以可能会消耗更多的 CPU 能力。
但是如果不进行适当和详细的性能测试,就很难确定。所以答案是什么?
编辑:此外,在某些情况下,notifyListeners()行为与setState(). 例如,我Text在 aStatelessWidget中有一个小部件,它包含一个Random值,当我通知 Class 中的一个不相关的值时,Text小部件也会得到更新。那么区别是什么呢?