我是 Flutter 的新手(来自 Android 背景),想在 Flutter 中实现 MQTT 客户端。
这就是我要的:
当应用程序打开/未被操作系统杀死时,MQTT 客户端应该是“活动的”。
我不想在后台运行它(没有打开应用程序,我知道在 iOS 中这样做有问题,请在某处阅读)但是当应用程序打开时。
根据订阅主题中的消息更新 UI/状态。
我查看了 pub 并找到了 2 个包,mqtt和mqtt_client,它们看起来像 dart 中 MQTT 的非 Flutter 实现。
我有一个想法如何使用这个库中的一个来使它与颤振一起工作,但不确定它是否有效:
创建并实现 MQTTObserver 状态小部件,它将异步连接到代理并侦听特定主题的消息并相应地更新状态。
将这个小部件包裹在 MaterialApp 周围
树下的任何小部件都可以访问 MQTTObserver 小部件的状态,以将其反映在其 UI 中。
你认为这是个好主意吗?它会起作用吗?你有更好的主意吗?或者我应该为 MQTT 实现特定于平台的实现(应该是我的最后选择)。
就像将类类型作为参数传递给方法一样,我想传递枚举,因为我想编写一个对枚举进行操作的通用方法。
我试过:
void foo(E):
print(E.values[0])
Run Code Online (Sandbox Code Playgroud)
但它不起作用。
有办法吗?
我想要在卡片上放置一个点,可以在卡片内任意移动。
这是我到目前为止的解决方案。
class RoomCard extends StatefulWidget {
final Room room;
RoomCard({
@required this.room,
}) : assert(room != null);
@override
_RoomCardState createState() => _RoomCardState();
}
class _RoomCardState extends State<RoomCard> {
double x = 0.0;
double y = 0.0;
@override
Widget build(BuildContext context) {
return SizedBox(
height: 400.0,
width: 400.0,
child: GestureDetector(
onPanUpdate: (p) {
setState(() {
x += p.delta.dx;
y += p.delta.dy;
});
},
child: Card(
child: Stack(
children: <Widget>[
Marker(
x: x,
y: y,
),
],
),
),
),
); …
Run Code Online (Sandbox Code Playgroud) 我将firebase_messaging v5.1.6与我的 flutter 应用程序集成,如自述文件中提到的“处理后台消息”选项。
\n\n这是我的文件的外观。
\n\n我的应用程序.kt
\n\nclass MyApplication : FlutterApplication(), PluginRegistrantCallback {\n override fun onCreate() {\n super.onCreate()\n FlutterFirebaseMessagingService.setPluginRegistrant(this)\n }\n\n override fun registerWith(registry: PluginRegistry) {\n GeneratedPluginRegistrant.registerWith(registry)\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\nfirebase_util.dart
\n\nclass MyApplication : FlutterApplication(), PluginRegistrantCallback {\n override fun onCreate() {\n super.onCreate()\n FlutterFirebaseMessagingService.setPluginRegistrant(this)\n }\n\n override fun registerWith(registry: PluginRegistry) {\n GeneratedPluginRegistrant.registerWith(registry)\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n我调用FirebaseUtil().messagingInit()
根initState
应用程序小部件。
这是应用程序启动时收到的错误日志。
\n\nE/MethodChannel#plugins.flutter.io/firebase_messaging( 6252): Failed to handle method call\nE/MethodChannel#plugins.flutter.io/firebase_messaging( 6252): java.lang.NullPointerException: Attempt to invoke virtual method \'android.content.Context android.app.Activity.getApplicationContext()\' on …
Run Code Online (Sandbox Code Playgroud) firebase flutter firebase-cloud-messaging flutter-dependencies
我有一张对象地图:
Map<String, Transaction> _userIncome = {
'four': Transaction(amount: 450, date: DateTime.now(), title: 'Einkommen', accountType: 'timr', notes: 'joa' , icon: Icon(Icons.today,), id: 'kololdcd', repeat: 'always'),
'five': Transaction(amount: 60, date: DateTime.now(), title: 'Bruder', accountType: 'timr', notes: 'brother' , icon: Icon(Icons.today,), id: 'kolkfrcd', repeat: 'never'),
'six': Transaction(amount: 60, date: DateTime.now(), title: 'Rückerstattung', accountType: 'timr', notes: 'brother' , icon: Icon(Icons.today,), id: 'kolofkfrcd', repeat: 'never'),
};
Run Code Online (Sandbox Code Playgroud)
如果我知道值(值是唯一的),我想获取密钥,以便我可以通过其键删除条目:
_userIncome.remove(key);
Run Code Online (Sandbox Code Playgroud)
我可以用给定的值识别条目:
_userIncome.values
.where((t) => t.date.difference(datte).inDays == 0 && t.id == transactionId);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何获得匹配的密钥,以便我可以删除该条目。或者有没有办法通过其值删除条目?
我很想听听一些建议:)
我是新手,对布局有麻烦。
粘性标头和其下方的滚动视图。我想到了使用带有两个子项的Column小部件-第一个是标题,第二个是ListView。
这是我的代码
Widget build(BuildContext context) {
return Material(
elevation: 8.0,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
title,
style:
Theme.of(context).textTheme.subhead.copyWith(fontSize: 18.0),
textAlign: TextAlign.left,
),
),
Divider(height: 4.0),
ListView.builder(itemBuilder: (context, i) {
return ListTile(
title: Text("Title $i"),
subtitle: Text("Subtitle $i"),
);
}),
],
),
);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误。
I/flutter ( 5725): ??? EXCEPTION CAUGHT BY RENDERING LIBRARY ??????????????????????????????????????????????????????????
I/flutter ( 5725): The following assertion was thrown during performResize():
I/flutter ( 5725): Vertical viewport was given …
Run Code Online (Sandbox Code Playgroud) 我在ListTile中使用Checkbox,如下所示:
ListTile(
leading: Checkbox(
value: _isChecked,
onChanged: (v) {
setState(() {
_isChecked = !_isChecked;
});
},
),
title: Text("is Bathroom"),
);
Run Code Online (Sandbox Code Playgroud)
如何禁用该复选框。我知道Checkbox小部件是无状态的。但是材料子包中是否提供了其他任何可以执行此操作的Widget。类似于InputDecorator。
我对DropdownButton也有同样的问题。我使用它如下以从下拉列表中选择表单中的项目。
InputDecorator(
decoration: InputDecoration(
labelText: "Type",
hintText: "Choose the type",
),
isEmpty: _type == null,
child: DropdownButton<int>(
value: _type,
isDense: true,
onChanged: (value) {
setState(() {
_type = value;
});
},
items: _buildDropdownItemList(),
),
);
Run Code Online (Sandbox Code Playgroud)
我在InputDecoration中尝试了enable参数,但这只是改变了装饰。用户仍然可以更改选择。
如何构建两个要垂直显示的列表,以便构建一个项目列表,然后按照该垂直顺序创建第二个列表。
我认为我不太了解 Flutter 中的约束,所以请耐心等待!
我想DropdownButtonFormField
从数据库填充它的项目。字符串可以是任何动态长度。所以我决定的是有一个固定的宽度,DropdownButtonFormField
并且DropdownMenuItem
会被省略Text
。
这是我尝试过的。
SizedBox(
width: 136.0,
child: DropdownButtonFormField<int>(
hint: Text("hintText")
decoration: InputDecoration(
contentPadding: const EdgeInsets.all(0.0),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: Colors.white),
),
isDense: true),
items: [
DropdownMenuItem<int>(
value: 0,
child: TextOneLine(
"less character",
),
),
DropdownMenuItem<int>(
value: 0,
child: TextOneLine(
"mooooorrrrreeee character",
),
)
]
),
);
class TextOneLine extends StatelessWidget {
final String data;
final TextStyle style;
final TextAlign textAlign;
final bool autoSize;
TextOneLine(
String data, {
Key key,
this.style, …
Run Code Online (Sandbox Code Playgroud) 我有一个SliverAppBar,在它下面是一个SliverList。
第一个SliverList项太靠近SliverAppBar。我想在两者之间添加一些间距,无论是通过SliverAppBar下方还是SliverList上方的底部边距。
如何才能做到这一点?
我想固定服务器的公共密钥,以便对服务器的任何请求都必须具有该公共密钥(这是为了防止像Charles这样的代理嗅探数据)。
我在Volley上用Android做过类似的事情。
如何使用Flutter做同样的事情?
我如何从DropdownButtonFormField删除下划线(请参见下面的照片),我尝试使用InputDecortaion进行各种选项组合,但找不到任何方法。
SizedBox(
width: 100.0,
child: DropdownButtonFormField<int>(
decoration: InputDecoration(
border: UnderlineInputBorder(
borderSide:
BorderSide(color: Colors.white))),
value: 2,
items: <DropdownMenuItem<int>>[
DropdownMenuItem<int>(
value: 1,
child: Text("Owner"),
),
DropdownMenuItem<int>(
value: 2,
child: Text("Member"),
),
],
),
Run Code Online (Sandbox Code Playgroud)