我在React Navigation和React Native 的导航方面遇到了问题.它是关于重置导航并返回主屏幕.
我在DrawerNavigator中构建了一个StackNavigator,主屏幕和其他屏幕之间的导航工作正常.但问题是,导航堆栈的增长和增长.我不知道如何从堆栈中删除屏幕.
例如,当从主屏幕进入设置屏幕,然后进入输入屏幕并最后再次进入主屏幕时,主屏幕在堆栈中是两次.使用后退按钮我不会离开应用程序,但再次进入输入屏幕.
再次选择主页按钮时,堆栈的重置会很好,但我不知道如何执行此操作.这里有人试图帮助其他有类似问题的人,但解决方案对我不起作用.
const Stack = StackNavigator({
Home: {
screen: Home
},
Entry: {
screen: Entry
},
Settings: {
screen: Settings
}
})
export const Drawer = DrawerNavigator({
Home: {
screen: Stack
}},
{
contentComponent: HamburgerMenu
}
)
Run Code Online (Sandbox Code Playgroud)
这是抽屉屏幕的一个简单示例
export default class HamburgerMenu extends Component {
render () {
return <ScrollView>
<Icon.Button
name={'home'}
borderRadius={0}
size={25}
onPress={() => { this.props.navigation.navigate('Home')}}>
<Text>{I18n.t('home')}</Text>
</Icon.Button>
<Icon.Button
name={'settings'}
borderRadius={0}
size={25}
onPress={() => { this.props.navigation.navigate('Settings')}}>
<Text>{I18n.t('settings')}</Text>
</Icon.Button>
<Icon.Button …Run Code Online (Sandbox Code Playgroud) 我目前正在使用React Native开发一个应用程序.基础是Ignite.目前,我经常在启动应用程序时收到一条我不理解的错误消息.也许有人可以告诉我它说的内容或如何解决问题.
Trying to add a root view with an explicit id already set. React Native uses the id field to track react tags and will overwrite this field. If that is fine, explicitly overwrite the id field to View.NO_ID before calling addRootView.
addRootViewGroup
NativeViewHierarchyManager.java:504
addRootView
NativeViewHierarchyManager.java:496
addRootView
UIViewOperationQueue.java:572
registerRootView
UIImplementation.java:129
addRootView
UIManagerModule.java:211
attachRootViewToInstance
ReactInstanceManager.java:897
setupReactContext
ReactInstanceManager.java:855
access$1000
ReactInstanceManager.java:109
run
ReactInstanceManager.java:821
handleCallback
Handler.java:739
dispatchMessage
Handler.java:95
dispatchMessage
MessageQueueThreadHandler.java:31
loop
Looper.java:148
run
MessageQueueThreadImpl.java:194
run
Thread.java:818
Run Code Online (Sandbox Code Playgroud)
我不确定哪些信息对我有帮助,但这些信息至少是我项目的依赖项(来自package.json):
"dependencies": {
"apisauce": "^0.14.0", …Run Code Online (Sandbox Code Playgroud) 我想为颤振中的屏幕小部件编写一个模拟测试。问题是,这个小部件使用了导航参数中的一个变量,我不确定如何模拟这个变量。
这是示例屏幕:
class TestScreen extends StatefulWidget {
static final routeName = Strings.contact;
@override
_TestScreenState createState() => _TestScreenState();
}
class _TestScreenState extends State<TestScreen> {
Contact _contact;
@override
Widget build(BuildContext context) {
_contact = ModalRoute.of(context).settings.arguments;
return Scaffold(
appBar: AppBar(title: Text(Strings.contact)),
body: Text(_contact.name),
);
}
}
Run Code Online (Sandbox Code Playgroud)
用这个命令我打开屏幕
Navigator.pushNamed(context, TestScreen.routeName, arguments: contact);
Run Code Online (Sandbox Code Playgroud)
通常我会模拟一些组件,但我不确定如何模拟屏幕参数。我希望它像这样工作。但是,我不知道我可以完全模拟什么。
when(screenArgument.fetchData(any))
.thenAnswer((_) async => expectedContact);
Run Code Online (Sandbox Code Playgroud)
这是当前的测试,这当然不起作用,因为 _contact 为空:
void main() {
testWidgets('contact fields should be filled with data from argument', (WidgetTester tester) async {
// GIVEN
final testScreen = TestApp(widget: TestScreen()); …Run Code Online (Sandbox Code Playgroud) 目前,我们在 ScrollView 中的 Flutter WebView 遇到了问题。我们希望在图像下方显示一个 WebView,其中包含以 HTML 编写的文章内容以及标题或按钮等其他内容。不应该只滚动 WebView。相反,整个内容应该一起滚动。
问题是,WebView 应与标题一起滚动。因此,据我所知,WebView 需要固定的高度。通过 Javascript 可以获得 WebView 的滚动高度。这在 iOS 上工作得很好,但在 Android 上,当 WebView 的高度太大时,应用程序会崩溃。原因似乎是在Android下WebView的高度可能只能与屏幕一样大。否则会有警告信息:
创建尺寸为 [1080, 11303] 的虚拟显示器可能会导致问题(https://github.com/flutter/flutter/issues/2897)。它大于设备屏幕尺寸:[1080, 1794]。
在 ListView 中使用 WebView 是否有更好的可能性?我们还尝试了flutter_html,但在某些文章中我们还需要 JavaScript,但不支持。在大页面上,它也有点滞后。
这是当前问题的示例应用程序。它适用于小页面,但不适用于大页面。崩溃时的高度取决于设备。例如,您可以手动将高度设置为 13000 之类的值:
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() => runApp(MaterialApp(home: CrashingWebViewExample()));
class CrashingWebViewExample extends StatefulWidget {
@override
_CrashingWebViewExampleState createState() => _CrashingWebViewExampleState();
}
class _CrashingWebViewExampleState extends State<CrashingWebViewExample> {
WebViewController _webViewController;
double _webViewHeight = 1;
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: …Run Code Online (Sandbox Code Playgroud) 我目前正在使用React Native和新的React Navigation.在那里,我正在尝试按照嵌套导航器的教程,但始终存在错误:
Route 'Home' should declare a screen. For example:
import MyScreen from './MyScreen';
...
Home: {
screen: MyScreen,
}
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么.当我单独启动导航器时,它们可以工作.但不幸的是没有合并.
这是我使用教程创建的App.js:
import React from 'react';
import {
AppRegistry,
Text,
View,
Button
} from 'react-native';
import {
StackNavigator,
TabNavigator
} from 'react-navigation';
class HomeScreen extends React.Component {
static navigationOptions = {
title: 'Welcome',
};
render() {
const { navigate } = this.props.navigation;
return <View>
<Text>Hello!</Text>
<Button
onPress={() => this.props.navigation.navigate('Chat', { user: 'Daniel' })}
title="ReactNavigation Test" …Run Code Online (Sandbox Code Playgroud) 目前我正在 Flutter 中使用 BLoC,我有一个关于 Bloc 中多个流的问题。
例如,当一个屏幕有多个应该依赖于 Bloc 的小部件时。我可以将整个屏幕包裹在 StreamBuilder 中,但是每次都会重建所有小部件。
示例块:
class TestBloc {
final StreamController _dataController = StreamController<String>();
final StreamController _appBarTitleController = StreamController<String>();
TestBloc();
Stream<String> get appBarTitle => _appBarTitleController.stream;
Stream<DataState> get data => _dataController.stream;
void fetchData(String path) async {
_dataController.sink.add(PokemonDataLoading());
Data data = await _getData();
_dataController.sink.add(Loaded(data));
_appBarTitleController.sink.add(data.name);
}
Future<Data> _getData(String path) async {
return await _dataRepository.fetchData(path);
}
void dispose() {
_dataController.close();
_appBarTitleController.close();
}
}
Run Code Online (Sandbox Code Playgroud)
在示例构建方法中,您可以看到两种不同的 StreamBuilder,一种用于应用栏标题,一种用于内容。当然,我可以在本示例中将它们包装到一个 StreamBuilder 中,但有时这并不容易。它们可能取决于其他数据或用户交互。
@override
Widget build(BuildContext context) {
_testBloc.fetchData();
return ScaffoldWithSafeArea(
title: StreamBuilder( …Run Code Online (Sandbox Code Playgroud) 我已经创建了一个新的React Native应用程序,react-native init ProjectName并尝试在IntelliJ中运行它.为此,我创建了一个新的运行配置:
但运行此配置后,仅react-native start执行而不是app(react-native run-android)的实际启动.在一个shell中它可以正常工作,但不能使用IntelliJ,因此不可能在IntelliJ中进行调试.
我正在使用最新的React Native版本0.50.1和IntelliJ 2017.2.5.
你知道这个问题,你知道如何解决吗?对于现有应用程序,它仍然有效,但不适用于新应用程序.在npm安装之后,现有项目似乎也有问题.
react-native ×4
android ×3
flutter ×3
javascript ×2
bloc ×1
crash ×1
flutter-test ×1
mocking ×1
mockito ×1
navigation ×1
webview ×1