在2023年,以下是一些最受欢迎的Flutter和React Native UI库:

Flutter:

  1. Google的Material Design (默认)
  2. Google的Cupertino (iOS风格)
  3. Firebase的FlutterFire (用于集成Firebase服务)
  4. GetX (用于状态管理和路由管理)
  5. Flutter Simple Dialog (简单对话框)
  6. Flutter Slider (滑块)
  7. Flutter Staggered Grid View (栅格视图)
  8. Flutter SVG (用于SVG图像的支持)
  9. Flutter Tab View (标签页)
  10. Flutter Toast (弹出式提示)

React Native:

  1. React Native Paper (Material Design)
  2. React Native Elements (更多样式的UI组件)
  3. React Native Vector Icons (图标)
  4. React Native Animateable (动画)
  5. React Native Gesture Handler (手势)
  6. React Native Reanimated (动画和手势)
  7. React Native Safe Area Context (安全区域)
  8. React Native Screens (更流畅的屏幕导航)
  9. React Native Vector Icons (矢量图标)
  10. React Native WebView (网页视图)

请注意,这些库的流行度可能会随着时间和社区需求的变化而变化。始终建议检查官方文档以获取最新和最全面的信息。




import React from 'react';
import { View, Text, StyleSheet } from 'react-native';
import TreeSelect from 'react-native-tree-select';
 
const data = [
  {
    label: 'Node 1',
    value: 'node1',
    children: [
      { label: 'Child 1', value: 'child1' },
      { label: 'Child 2', value: 'child2' }
    ]
  },
  {
    label: 'Node 2',
    value: 'node2'
  }
];
 
const TreeSelectExample = () => {
  const [selectedValue, setSelectedValue] = React.useState(null);
 
  return (
    <View style={styles.container}>
      <TreeSelect
        data={data}
        value={selectedValue}
        onChange={setSelectedValue}
        style={styles.treeSelect}
      />
      <View style={styles.selectedContainer}>
        <Text>Selected Value: {selectedValue}</Text>
      </View>
    </View>
  );
};
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    padding: 20
  },
  treeSelect: {
    width: '100%',
    height: 300
  },
  selectedContainer: {
    marginTop: 20,
    padding: 10,
    backgroundColor: '#ddd'
  }
});
 
export default TreeSelectExample;

这个代码示例展示了如何在React Native应用中使用react-native-tree-select库来创建一个多级选择器。代码中定义了一个简单的树状数据结构,并使用TreeSelect组件来渲染它。用户可以选择任何节点,选择的值会实时更新并显示在屏幕上方的文本组件中。




import React from 'react';
import { View, Text, Image, StyleSheet } from 'react-native';
 
const App = () => {
  return (
    <View style={styles.container}>
      <Image source={{ uri: 'https://example.com/poster.jpg' }} style={styles.poster} />
      <View style={styles.details}>
        <Text style={styles.title}>电影标题</Text>
        <Text style={styles.rating}>9.5/10</Text>
        <Text style={styles.description}>
          一个关于某个主题的电影描述...
        </Text>
      </View>
    </View>
  );
};
 
const styles = StyleSheet.create({
  container: {
    flexDirection: 'row',
    padding: 10
  },
  poster: {
    width: 150,
    height: 200,
    marginRight: 10
  },
  details: {
    flex: 1
  },
  title: {
    fontSize: 18,
    fontWeight: 'bold'
  },
  rating: {
    fontSize: 16,
    color: '#009688'
  },
  description: {
    fontSize: 14,
    color: '#777',
    marginTop: 5
  }
});
 
export default App;

这段代码展示了如何使用React Native的基本组件来创建一个简单的电影海报组件,其中包含了一个海报图片和电影的详细信息。样式使用了flexbox布局来实现响应式设计,确保在不同尺寸的屏幕上都有良好的显示效果。




import React from 'react';
import { View } from 'react-native';
import { TextField } from 'react-native-material-textfield';
 
export default class MyForm extends React.Component {
  state = {
    username: '',
    password: ''
  };
 
  handleUsernameChange = (username) => {
    this.setState({ username });
  };
 
  handlePasswordChange = (password) => {
    this.setState({ password });
  };
 
  render() {
    return (
      <View>
        <TextField
          label="用户名"
          value={this.state.username}
          onChangeText={this.handleUsernameChange}
        />
        <TextField
          label="密码"
          value={this.state.password}
          onChangeText={this.handlePasswordChange}
          secureTextEntry={true} // 设置密码字段为密文显示
        />
      </View>
    );
  }
}

这段代码展示了如何在React Native应用中使用react-native-material-textfield库来创建一个用户名和密码的登录表单。代码中使用了TextField组件,并通过state管理输入的状态,以确保用户的输入能够被组件内部的处理函数捕获和更新。

在React Native中,Alert.alert是一个用于显示一个带有标题、信息、取消按钮以及一些可选操作按钮的警告弹窗的API。这个弹窗会在iOS和Android上显示为一个本地化的模态窗口。

以下是一个使用Alert.alert的基本示例:




import React, { Component } from 'react';
import { Alert, Button } from 'react-native';
 
export default class AlertExample extends Component {
  showAlert = () => {
    Alert.alert(
      '标题',
      '这是一个简单的警告弹窗',
      [
        {
          text: '取消',
          onPress: () => console.log('取消按钮被点击'),
          style: 'cancel',
        },
        { text: '确定', onPress: () => console.log('确定按钮被点击') },
      ],
      { cancelable: false }
    );
  };
 
  render() {
    return (
      <Button title="显示警告" onPress={this.showAlert} />
    );
  }
}

在这个例子中,当按钮被按下时,showAlert函数会被调用,它创建并显示一个包含标题、信息以及两个按钮的警告弹窗。其中一个按钮设置了style: 'cancel',这表示它是一个取消按钮,它不会执行任何操作,只是关闭弹窗。另一个按钮是一个普通的操作按钮,点击会在控制台输出一条信息。cancelable选项被设置为false,这意味着用户不能通过点击背景或使用物理按键来取消弹窗。

触摸事件在React Native中是通过传递给各个组件的onStartShouldSetResponder和onStartShouldSetResponderCapture方法来处理的。当ScrollView和TouchableWithoutFeedback组件同时处于屏幕上时,可能会发生事件冲突。

为了解决这个问题,可以使用ScrollView的scrollEventThrottle属性来减少事件的触发频率,或者使用PanResponder来处理更复杂的触摸事件。

以下是一个简单的例子,展示如何使用PanResponder来解决这个问题:




import React, { Component } from 'react';
import { View, ScrollView, Text, PanResponder, TouchableWithoutFeedback, StyleSheet } from 'react-native';
 
export default class TouchableInScrollView extends Component {
  constructor(props) {
    super(props);
 
    this._panResponder = PanResponder.create({
      onStartShouldSetPanResponder: (evt, gestureState) => true,
      onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
      onMoveShouldSetPanResponder: (evt, gestureState) => true,
      onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
    });
  }
 
  render() {
    return (
      <ScrollView style={styles.scrollView}>
        <View style={styles.container}>
          {/* 在这里放置你的内容 */}
          <TouchableWithoutFeedback
            style={styles.button}
            {...this._panResponder.panHandlers}
            onPress={this.handlePress}>
            <Text>Click Me!</Text>
          </TouchableWithoutFeedback>
        </View>
      </ScrollView>
    );
  }
 
  handlePress = () => {
    console.log('Button clicked!');
  };
}
 
const styles = StyleSheet.create({
  scrollView: {},
  container: {
    flex: 1,
    padding: 20,
  },
  button: {
    alignItems: 'center',
    backgroundColor: '#DDDDDD',
    padding: 10,
    marginBottom: 10,
  },
});

在这个例子中,我们创建了一个PanResponder,并将其panHandlers添加到了TouchableWithoutFeedback组件中。这样,当用户触摸按钮时,PanResponder会拦截触摸事件,并且只有在用户确实移动手指时才会处理滑动事件,否则会处理点击事件。这样就可以避免在ScrollView中点击事件与滑动事件冲突的问题。

在Android Studio中创建React Native项目,你需要先安装React Native Command Line Tools。以下是创建React Native项目的步骤:

  1. 打开终端(在Mac上)或命令提示符/PowerShell(在Windows上)。
  2. 确保你已安装Node.js(建议版本8.3或更高)。
  3. 运行以下命令安装React Native Command Line Tools:



npm install -g react-native-cli
  1. 创建一个新的React Native项目:



react-native init AwesomeProject
  1. 等待一段时间,依赖将会被安装。
  2. 打开Android Studio。
  3. 选择 "Open an existing Android Studio project"。
  4. 浏览到你刚才创建的React Native项目目录,并选择 android 文件夹。
  5. 打开项目后,Android Studio可能会提示你安装一些额外的插件,确保安装React Native和JavaScript插件。
  6. 一旦安装完成,你可以构建和运行项目了。

注意:确保你的Android Studio是最新版本,以便与React Native工具兼容。

这是一个高层次的指南。如果你遇到具体的错误信息或问题,请提供详细信息以便获得更具体的帮助。

以下是一个简单的React Native项目的代码实例,展示了如何创建一个简单的页面,并在其中显示一个文本标签。




import React, { Component } from 'react';
import { Text, View, StyleSheet } from 'react-native';
 
export default class App extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome}>
          Welcome to React Native!
        </Text>
      </View>
    );
  }
}
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
});

这段代码首先导入了React和React Native必需的组件,然后定义了一个名为App的类组件,它继承自Component。在render方法中,它返回一个View组件,该组件包含一个Text组件,后者显示了欢迎信息。StyleSheet.create用于定义展示文本的样式。

这个简单的例子展示了如何开始构建一个React Native应用,并且是学习React Native的一个很好的起点。




import React, { useState } from 'react';
import { StyleSheet, Text, View, Button, Alert } from 'react-native';
import Speech from '@react-native-community/speech';
 
export default function App() {
  const [isSpeaking, setIsSpeaking] = useState(false);
 
  const startSpeaking = () => {
    if (!isSpeaking) {
      Speech.speak({
        text: '你好,世界!',
        language: 'zh-CN',
        onStart: () => setIsSpeaking(true),
        onFinish: () => setIsSpeaking(false),
        onError: (e) => Alert.alert('发生错误', e.error)
      });
    }
  };
 
  const stopSpeaking = () => {
    if (isSpeaking) {
      Speech.stop();
      setIsSpeaking(false);
    }
  };
 
  return (
    <View style={styles.container}>
      <Button title="开始" onPress={startSpeaking} disabled={isSpeaking} />
      <Button title="停止" onPress={stopSpeaking} disabled={!isSpeaking} />
    </View>
  );
}
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  }
});

这段代码展示了如何在React Native应用中使用@react-native-community/speech库来实现文本转语音(TTS)功能。代码中定义了startSpeaking和stopSpeaking函数来控制语音播报的开始和停止,并通过按钮交互来触发这些函数。同时,代码使用了React Hook useState来管理组件的状态。

React Native 中一个流行的动画导航库是 react-navigation 配合 react-native-reanimated 和 react-native-gesture-handler。以下是一个使用 react-navigation 和 react-navigation-stack 创建带有动画的堆栈导航器的示例代码:




import React from 'react';
import { Animated, Easing } from 'react-native';
import { createStackNavigator } from 'react-navigation-stack';
import { Transition } from 'react-navigation-transitions';
 
// 定义过渡动画配置
const slideFromRight = (props) => {
  const { layout, scene } = props;
  const { index } = scene;
 
  const width = layout.initWidth;
  const translateX = width * index;
 
  return {
    transform: [{
      translateX: translateX
    }]
  };
};
 
// 定义动画持续时间和动画类型
const duration = 500;
 
const slideFromRightTransitionConfig = () => ({
  duration: duration,
  // 自定义动画的 easing 函数
  easing: Easing.inOut(Easing.ease),
  // 自定义动画的样式
  screenInterpolator: slideFromRight
});
 
// 创建一个自定义TransitionComponent使用上面定义的动画
const CustomTransition = ({ route, navigation }) => (
  <Transition
    configureTransition={slideFromRightTransitionConfig}
    navigation={navigation}
    route={route}
  />
);
 
// 定义你的屏幕
const HomeScreen = () => (
  <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
    <Text>Home Screen</Text>
  </View>
);
 
const ProfileScreen = () => (
  <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
    <Text>Profile Screen</Text>
  </View>
);
 
// 创建导航器
const AppNavigator = createStackNavigator({
  Home: {
    screen: HomeScreen,
    // 使用自定义的TransitionComponent
    transitionConfig: CustomTransition
  },
  Profile: {
    screen: ProfileScreen,
    // 使用自定义的TransitionComponent
    transitionConfig: CustomTransition
  }
});
 
export default AppNavigator;

这个示例展示了如何创建一个带有自定义滑入动画的堆栈导航器。Transition 组件允许你定义屏幕之间切换的动画,而 slideFromRight 函数则定义了具体的动画样式。你可以通过调整 duration 和 slideFromRight 中的 translateX 值来改变动画的持续时间和屏幕滑动的路径。