在我的应用程序中,我正在存储一些数据SharedPreferences
- 它可以根据需要运行.现在我想为一些不正确的情况创建日志消息.
我成功处理了首选项为空或在加载时抛出异常的情况.在保存值时可以显示的唯一错误是commit()
返回false
- 我不知道为什么会发生这种情况以及在这种情况下我应该做些什么.
所以我的问题是:该commit()
方法何时返回false
?在那种情况下我该怎么办?一个可能的解决方案是commit()
一次又一次地呼叫(类似的东西while (!editor.commit()) {}
)?
我是Flutter的新手所以请耐心等待.我有一个分页API,这意味着在调用时example.com?loaditems.php?page=0
将加载前10个项目(播客列表),example.com?loaditems.php?page=1
并将加载项目从10到20,依此类推.我希望StreamBuilder首先获取第0页,然后当列表到达底部时,它应该加载第1页并显示它.要检查我是否已到达列表视图中的最后一项,我使用的ScrollController
是ListView.
现在我在bloc模式中使用StreamBuilder,ListView,InheritedWidget.我不确定我是否已正确实现它所以我将粘贴整个代码.我的问题是,这是正确的BLOC模式方式吗?如果不是那么它是什么?我还看到了这篇文章:https://crossingthestreams.io/loading-paginated-data-with-list-views-in-flutter/ 最后它说"更新:"但我无法理解它.
这是' 应用程序的切入点:
void main() => runApp(new MaterialApp(
title: "XYZ",
theme: ThemeData(fontFamily: 'Lato'),
home: PodcastsProvider( //This is InheritedWidget
child: RecentPodcasts(), //This is the child of InheritedWidget
),
));
Run Code Online (Sandbox Code Playgroud)
这是InheritedWidget PodcastsProvider:
class PodcastsProvider extends InheritedWidget{
final PodcastsBloc bloc; //THIS IS THE BLOC
PodcastsProvider({Key key, Widget child})
: bloc = PodcastsBloc(),
super(key: key, child: child);
@override
bool updateShouldNotify(InheritedWidget oldWidget) {
return true;
}
static PodcastsBloc of(BuildContext context){
return (context.inheritFromWidgetOfExactType(PodcastsProvider) …
Run Code Online (Sandbox Code Playgroud) 有没有办法禁用Flutter的“死亡的红色屏幕”?我不介意在调试过程中使用它,但是它似乎也出现在生产版本中-而且我找不到有关如何禁用它或自己捕获错误的任何信息。
我尝试使用FlutterError.onError
和捕获杂散错误runZoned(onError)
,但是两者都没有阻止红屏的出现。
作为参考,我正在谈论以下屏幕:
我有一个包含多个字段的 Dart 类,这些字段必须是final
,因为该类扩展了另一个标有@immutable
. 这些字段的值应该在创建类的实例时计算。在 Dart 中,“必须在构造函数体开始之前初始化最终实例变量”(来自 dartlang.org)。在该范围内,您只能调用static
方法。
这对我有用,除了某些字段依赖于相同的计算,这意味着相同的计算进行了两次。有没有办法避免这种情况,即通过保存一些临时结果?
我目前的代码:
class _IntegralCurve extends Curve {
static double delta = 0.01;
_IntegralCurve(this.original) :
integral = calculateIntegral(original),
values = calculateNormalizedValues(original);
final Curve original;
final double integral; // Accessible to other classes.
final Map<double, double> values;
/// Does the actual integrating work. Called twice.
static Map<double, double> integrate(Curve original) {
double integral = 0.0;
final values = Map<double, double>();
for (double t = 0.0; …
Run Code Online (Sandbox Code Playgroud) 有什么方法可以检测用户是否离开当前页面?我认为这WidgetsBinding
不会起作用,因为它可以自行处理这些事件。那么,有人有什么解决方案吗?任何帮助表示赞赏。
我想声明,但不想在抽象类中定义工厂构造函数。
就我而言,我想创建一个方法,该方法可以接受实现该String toJson()
方法的任何类以及fromJson(Map<String, dynamic> data)
工厂构造函数。
有什么办法可以在Dart中实现?我正在寻找类似以下内容的东西,这是无效的Dart代码:
abstract class JsonSerializable {
factory fromJson(Map<String, dynamic> data);
String toJson();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 为 Dart 编写代码生成器build_runner
,但是我的构建器没有被调用以在字段中进行注释,尽管它确实适用于类中的注释。
是否也可以在字段(或任何地方)调用生成器进行注释?
例如,为以下文件调用构建器:
import 'package:my_annotation/my_annotation.dart';
part 'example.g.dart';
@MyAnnotation()
class Fruit {
int number;
}
Run Code Online (Sandbox Code Playgroud)
但不是这个:
import 'package:my_annotation/my_annotation.dart';
part 'example.g.dart';
class Fruit {
@MyAnnotation()
int number;
}
Run Code Online (Sandbox Code Playgroud)
这是注释的定义:
class MyAnnotation {
const MyAnnotation();
}
Run Code Online (Sandbox Code Playgroud)
这就是生成器的定义方式。目前,只要调用它就会中止,从而导致打印错误消息。
library my_annotation_generator;
import 'package:analyzer/dart/element/element.dart';
import 'package:build/build.dart';
import 'package:my_annotation/my_annotation.dart';
import 'package:source_gen/source_gen.dart';
Builder generateAnnotation(BuilderOptions options) =>
SharedPartBuilder([MyAnnotationGenerator()], 'my_annotation');
class MyAnnotationGenerator extends GeneratorForAnnotation<MyAnnotation> {
@override
generateForAnnotatedElement(Element element, ConstantReader annotation, _) {
throw CodeGenError('Generating code for annotation is not implemented yet.');
}
Run Code Online (Sandbox Code Playgroud)
这是build.yaml
配置: …
我正在使用Flutter模态底板来显示一些选项供用户选择。我有一个Column
带有ListTile
s 的列表作为底部工作表的内容。
我的问题是,如果我有6 ListTile
s 以上的时间,某些将被切断而不显示。
有没有办法使底部的工作表可滚动?
我想定义一个square()
没有不必要的运行时开销(没有dyn
关键字)的惰性方法,可以在 any 上调用Iterable<Item = u8>
并返回另一个Iterable<Item = u8>
,如下所示:
fn main() {
vec![1, 2, 3, 4, 5]
.iter()
.filter(|x| x > 1)
.squared()
.filter(|x| x < 20);
}
Run Code Online (Sandbox Code Playgroud)
我知道如何定义squared()
为独立函数:
fn squared<I: Iterator<Item = u8>>(iter: I) -> impl Iterator<Item = u8> {
iter.map(|x| x * x)
}
Run Code Online (Sandbox Code Playgroud)
Iterator<Item = u8>
不过,要定义该方法,我必须首先定义一个trait
. 这就是我挣扎的地方?-?traits 不能impl
在返回值中使用关键字。
我正在寻找类似以下的东西,但它不起作用:
trait Squarable<I: Iterator<Item = u8>> {
fn squared(self) -> I;
}
impl<I, J> Squarable<I> for …
Run Code Online (Sandbox Code Playgroud) 我有一个Vec
值,并且想要filter
那些匹配特定模式的值。
什么是惯用的办法只有检查,如果一个表达式匹配的模式,而不必做一些与比赛?
enum Kind {
A,
B(char),
}
let vector: Vec<Option<Kind>> = ...;
vector.filter(|item| /* check if item matches pattern Some(Kind::B(_)) */)
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用match
关键字:
vector.filter(|item| match item {
Some(Kind::B(_)) => true,
_ => false,
})
Run Code Online (Sandbox Code Playgroud)
或if let
关键字:
vector.filter(|item| {
if let Some(Kind::B(_)) = item {
true
} else {
false
}
})
Run Code Online (Sandbox Code Playgroud)
但是在这两个示例中,代码看起来仍然很庞大,因为我需要手动提供true
和false
常量。我觉得应该有一种更优雅的方式来做到这一点,类似于以下内容:
vector.filter(|item| matches(item, Some(Kind::B(_))))
Run Code Online (Sandbox Code Playgroud)