我正在尝试在使用 Provider 管理的 Flutter 应用程序中实现本地数据库支持,现在我想让数据检索遵循状态管理模式,但我一直没有做到。
我试图制作一个传统的 Provider 来实现这一点,但该应用程序陷入了对数据库的请求循环中,所以经过一番搜索我找到了 FutureProvider,但我找不到如何从正在加载的数据中获取快照
class _ReceiptsRouteState extends State<ReceiptsRoute> {
List<Receipt> receipts = [];
@override
Widget build(BuildContext context) {
return FutureProvider(
initialData: List(),
builder: (_){
return DBProvider().receipts().then((result) {
receipts = result;
});
},
child: Scaffold(
appBar: AppBar(
title: Text(AppLocalizations.of(context).history),
),
body: Container(
child: ListView.builder(
itemBuilder: (context, position) {
final item = receipts[position];
return ListTile(
title: Text(item.date),
);
},
),
),
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的应用程序正在按我想要的方式运行,但不是按照它应该如何运行,我使用 FutureBuilder 直接从数据库中获取数据,但我知道它应该通过提供程序来,所以我想使它正确
在我的用例中,我需要确保我的地图可以动态调整大小而不会崩溃,您可能建议使用 resizeToAvoidBottomPadding,但我的问题不止于此,例如,如果我使用 facebook messanger 聊天头并打开它,我的应用程序会崩溃键盘(这使应用程序调整大小迫使地图调整大小因此崩溃)
以下代码位于子路由内(位于包含底部标签栏的路由内,因此以下代码位于该栏的按钮之一内)
@override
Widget build(BuildContext context) {
return Stack(
children: <Widget>[
GoogleMap(
onMapCreated: _onMapCreated,
mapType: MapType.normal,
initialCameraPosition: CameraPosition(
target: LatLng(30, 40),
zoom: 11,
),
onCameraMove: (pos) {
setState(() {
// do something
});
},
onCameraIdle: () {
setState(() {
// do something
});
},
),
TextField(),
],
);
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是我在控制台中收到的错误消息:
E/flutter (16068): [ERROR:flutter/shell/platform/android/platform_view_android_jni.cc(39)] java.lang.AbstractMethodError: abstract method "void io.flutter.plugin.platform.PlatformView.onInputConnectionLocked()"
E/flutter (16068): at io.flutter.plugin.platform.VirtualDisplayController.onInputConnectionLocked(VirtualDisplayController.java:166)
E/flutter (16068): at io.flutter.plugin.platform.PlatformViewsController.lockInputConnection(PlatformViewsController.java:370)
E/flutter (16068): at io.flutter.plugin.platform.PlatformViewsController.access$1000(PlatformViewsController.java:36)
E/flutter (16068): at io.flutter.plugin.platform.PlatformViewsController$1.resizePlatformView(PlatformViewsController.java:165)
E/flutter (16068): …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使箭头键在单行(左+右)中的字符之间以及自定义外壳(学期项目)的历史命令(上+下)之间移动。
此时,当击中其中一个箭头时 ^[[A, ^[[B, ^[[C 或 ^[[D 显示出来,按下回车后,我意识到其中一个被击中了:
char a = getchar();
if (a == '\033') {
getchar();
int ch2 = getchar();
switch(ch2){
case 'A':
printf("UP\n");
break;
case 'B':
printf("DOWN\n");
break;
case 'D':
printf("LEFT\n");
break;
case 'C':
printf("RIGHT\n");
break;
default:
printf("SOME OTHER SCROLL KEY PRESSED: %d %d\n", a, ch2);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我想得到的是,一旦我击中其中一个箭头,动作就会发生而不会显示任何内容。
我有这个应用程序的想法,但它在很大程度上取决于 CMD,所以我想知道我是否可以从 Flutter 桌面应用程序中打开任何其他应用程序(例如 CMD)。
我知道在 Java 中它可以使用 exec() 来完成,但是在 dart/flutter 中它有什么等价物吗?