我在我的代码中HomeActivity使用了以下一些代码LiveData.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Show the launch splash screen.
//
this.setContentView(R.layout.activity_home)
this.viewModel = ViewModelProviders.of(this).get(HomeViewModel::class.java)
this.viewModel.getUser().observe(this, Observer { user: User? ->
});
}
Run Code Online (Sandbox Code Playgroud)
虽然这似乎有效,但以下部分是什么意思?
Observer { user: User? ->
}
Run Code Online (Sandbox Code Playgroud)
这必须导致一个符合Observer接口的对象
void onChanged (T t)
Run Code Online (Sandbox Code Playgroud)
https://developer.android.com/reference/android/arch/lifecycle/Observer.html
如何
Observer { user: User? ->
}
Run Code Online (Sandbox Code Playgroud)
导致一个onChanged方法的对象?
我不知道将接口名称放在lambda表达式前面是什么意思.
谢谢!
我一直在研究 SliverAppBar、CustomScrollView、NestedScrollView、SliverPersistentHeader 等。我找不到一种方法来构建类似 Instagram 用户个人资料屏幕的标题,其中只有标签栏被固定。屏幕的主体是一个 TabBarView,每个窗格都有一个可滚动的列表。
使用 SliverAppBar,可以很容易地在底部参数中添加 TabBar。但我想在 TabBar 上方有一个未知/可变高度的额外小部件。当页面滚动时,额外的小部件应该滚动到一边,然后 TabBar 是固定在屏幕顶部的。
我所能管理的只是标签栏之前的固定内容和固定标签栏。我无法让标题向上滚动并将 贴TabBar在AppBar.
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(home: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 2,
child: Scaffold(
appBar: AppBar(
title: Text("pabloaleko"),
),
body: CustomScrollView(
physics: const BouncingScrollPhysics(),
slivers: <Widget>[
SliverToBoxAdapter(
child: SafeArea(
child: Text("an unknown\namount of content\n goes here in the header"),
),
),
SliverToBoxAdapter(
child: TabBar(
tabs: [
Tab(child: Text('Days', style: TextStyle(color: Colors.black))), …Run Code Online (Sandbox Code Playgroud) dart flutter flutter-layout customscrollview flutter-sliverappbar
我想在我的应用程序启动时尽快在屏幕上显示一个小部件。在向用户显示小部件后,我想在通过推动另一个屏幕离开启动屏幕之前进行一些应用程序初始化(例如设置数据库)。我不知道把我的应用程序初始化代码放在哪里。类似于viewDidAppeariOS 上的东西。
这是我基于initState.
class Launch extends StatefulWidget {
@override
_LaunchState createState() {
return _LaunchState();
}
}
class _LaunchState extends State<Launch> {
@override
Widget build(final BuildContext context) {
print('LaunchState build start');
final Widget w = Center(
child: Text('Launching...'),
);
print('LaunchState build end');
return w;
}
@override
void initState() {
print('LaunchState initState start');
super.initState();
print('LaunchState initState middle');
_appInitialization();
print('LaunchState initState end');
}
void _appInitialization() {
print('LaunchState _appInitialization');
}
}
Run Code Online (Sandbox Code Playgroud)
输出是
flutter: LaunchState initState start
flutter: LaunchState initState middle …Run Code Online (Sandbox Code Playgroud) 很多时候,当我查看git diff使用 Android Studio 构建的 Android 应用程序的输出时,我会看到以下内容。有时它languageLevel从JDK_1_7变为JDK_1_8。其他时候它languageLevel从JDK_1_8变为JDK_1_7。怎么这么优柔寡断??
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -24,7 +24,7 @@
</value>
</option>
</component>
- <component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
Run Code Online (Sandbox Code Playgroud) 在我的 Flutter 应用程序中的任意深度,用户可以通过点击按钮退出应用程序。如何用身份验证/登录屏幕替换当前的屏幕堆栈并为过渡提供“漂亮”的动画?
我目前正在执行以下操作,但动画一点也不漂亮。在 iOS 上,堆栈上的屏幕向右滑出,认证屏幕从右侧滑入。滑动太多。
NavigatorState navigatorState = Navigator.of(this.context);
while (navigatorState.canPop()) {
navigatorState.pop();
}
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (BuildContext context) {
return AuthScreen();
}),
);
Run Code Online (Sandbox Code Playgroud)
我宁愿让认证屏幕在 iOS 上从底部向上滑动,并让认证屏幕在 Android 上以普通动画出现。然后移除堆栈中较低的所有屏幕。我找不到在 Flutter 中以这种方式操作堆栈的方法。
我创建了一个新插件
flutter create --template plugin alfalfa
Run Code Online (Sandbox Code Playgroud)
其生成lib/alfalfa.dart包含
import 'dart:async';
import 'package:flutter/services.dart';
class Alfalfa {
static const MethodChannel _channel =
const MethodChannel('alfalfa');
//...
}
Run Code Online (Sandbox Code Playgroud)
我想添加一个EventChannel这样Java和Objective-C代码可以回调到Dart代码。我不知道该叫什么名字EventChannel。
final EventChannel _eventChannel =
const EventChannel("com.rollingfields.alfalfa/events");
Run Code Online (Sandbox Code Playgroud)
或者
final EventChannel _eventChannel =
const EventChannel("alfalfa/events");
Run Code Online (Sandbox Code Playgroud)
或者是其他东西?有约定吗?
如果更好的选择EventChannel是包含反向域的名称,我应该将生成的名称重命名MethodChannel为吗com.rollingfields.alfalfa?
signIn我在 Dart 程序中有一个异步函数,它接受username和password字符串参数。该函数调用远程服务器,如果用户名和/或密码丢失或不正确,服务器会使用会话令牌或验证消息进行响应。
目前我已经通过回调实现了这一点。服务器响应后会调用适当的回调。不需要await。
signIn(username, password, onSuccess, onFailure);
Run Code Online (Sandbox Code Playgroud)
我对 Dart 的了解越多,我觉得上面的内容并不是真正的 Dart 做事方式。我应该await与tryand结合使用吗catch?像下面这样的东西吗?
try {
sessionToken = await signIn(username, password);
// navigate from the sign in screen to the home screen.
} on InvalidParams catch (e) {
// e contains the server's validation messages
// show them to the user.
}
Run Code Online (Sandbox Code Playgroud)
登录凭据可能无效。处理它们是正常的程序流程。我被教导永远不要将 try/catch 用于常规的、预期的程序流程。Dart 语言似乎鼓励使用异常处理,尤其是与await.
来自错误类文档[强调我的。]
如果在调用函数之前无法检测到条件,则被调用的函数不应抛出错误。它仍然可能抛出一个值,但调用者必须捕获抛出的值,从而有效地使其成为替代结果而不是错误。抛出的对象可以选择实现 Exception 来记录它代表异常但不是错误的发生,但它除了记录之外没有其他作用。
实现这个的最好的 Dart …
我在 Kotlin 中看到了很多例子,其中活动类有一个伴随对象来封装启动意图的创建,如下所示。似乎特别受 Java 启发。
class HomeActivity : AppCompatActivity() {
companion object {
fun newStartIntent(context: Context): Intent {
val intent = Intent(context, HomeActivity::class.java)
return intent
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.setContentView(R.layout.activity_home)
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
既然 Kotlin 有顶级函数,为什么不跳过伴随对象而只拥有一个顶级函数呢?
fun newHomeActivityStartIntent(context: Context): Intent {
val intent = Intent(context, HomeActivity::class.java)
return intent
}
class HomeActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.setContentView(R.layout.activity_home)
// ...
}
// ...
}
Run Code Online (Sandbox Code Playgroud)