Duc*_*ang 5 user-interface react-native expo
阅读 Tamagui 文档一段时间后https://tamagui.dev/docs/guides/expo
我认为 Tamagui 仅当使用此命令与 Expo 项目一起生成时才在 Expo 中使用 npm create tamagui。如果 Tamagui 实际上可以与现有的 Expo React Native 应用程序集成,请给我提供文档或教程。提前致谢。
小智 12
基本上,您需要遵循一些步骤......
要使用主题,您需要更新app.json,将“userInterfaceStyle”的值更改为“automatic”。
"userInterfaceStyle": "automatic",
Run Code Online (Sandbox Code Playgroud)
一些依赖项对于 tamagui 的项目是必需的,因此,让我们安装所有依赖项:
npx expo install expo-font expo-linear-gradient react-native-reanimated
Run Code Online (Sandbox Code Playgroud)
现在,我们将安装一堆软件包:
有一些可选的软件包,但我强烈建议您也安装..
yarn add tamagui @tamagui/shorthands @tamagui/themes @tamagui/font-inter @tamagui/animations-react-native @tamagui/config @tamagui/babel-plugin babel-plugin-transform-inline-environment-variables react-native-web react-dom
Run Code Online (Sandbox Code Playgroud)
之后,我们需要像这样更新我们的babel.config.js
process.env.TAMAGUI_TARGET = 'native'; // Don't forget to specify your TAMAGUI_TARGET here
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
plugins: [
['@tamagui/babel-plugin', {
components: ['tamagui'],
config: './tamagui.config.ts',
logTimings: true
}],
['transform-inline-environment-variables', {
include: 'TAMAGUI_TARGET',
}],
'react-native-reanimated/plugin'
]
};
};
Run Code Online (Sandbox Code Playgroud)
现在我们需要在项目的根目录中创建配置文件
touch tamagui.config.ts
Run Code Online (Sandbox Code Playgroud)
并将以下代码粘贴到tamagui.config.ts中
import { createInterFont } from '@tamagui/font-inter';
import { createMedia } from '@tamagui/react-native-media-driver';
import { shorthands } from '@tamagui/shorthands';
import { themes, tokens } from '@tamagui/theme-base';
import { createTamagui } from 'tamagui';
import { createAnimations } from '@tamagui/animations-react-native';
const animations = createAnimations({
bouncy: {
type: 'spring',
damping: 10,
mass: 0.9,
stiffness: 100,
},
lazy: {
type: 'spring',
damping: 20,
stiffness: 60,
},
quick: {
type: 'spring',
damping: 20,
mass: 1.2,
stiffness: 250,
}
});
const headingFont = createInterFont();
const bodyFont = createInterFont();
const config = createTamagui({
animations,
defaultTheme: 'dark',
shouldAddPrefersColorThemes: false,
themeClassNameOnRoot: false,
shorthands,
fonts: {
heading: headingFont,
body: bodyFont,
},
themes,
tokens,
media: createMedia({
xs: { maxWidth: 660 },
sm: { maxWidth: 800 },
md: { maxWidth: 1020 },
lg: { maxWidth: 1280 },
xl: { maxWidth: 1420 },
xxl: { maxWidth: 1600 },
gtXs: { minWidth: 660 + 1 },
gtSm: { minWidth: 800 + 1 },
gtMd: { minWidth: 1020 + 1 },
gtLg: { minWidth: 1280 + 1 },
short: { maxHeight: 820 },
tall: { minHeight: 820 },
hoverNone: { hover: 'none' },
pointerCoarse: { pointer: 'coarse' },
})
});
export type AppConfig = typeof config;
declare module 'tamagui' {
// overrides TamaguiCustomConfig so your custom types
// work everywhere you import `tamagui`
interface TamaguiCustomConfig extends AppConfig {}
}
export default config;
Run Code Online (Sandbox Code Playgroud)
将 Tamagui 提供程序和主题支持添加到 App.tsx 中
import { StatusBar } from "expo-status-bar";
import { useColorScheme } from "react-native";
import { Paragraph, Spacer, TamaguiProvider, Theme, YStack } from "tamagui";
import { useFonts } from "expo-font";
import config from "./tamagui.config";
export default function App() {
const colorScheme = useColorScheme();
const [loaded] = useFonts({
Inter: require("@tamagui/font-inter/otf/Inter-Medium.otf"),
InterBold: require("@tamagui/font-inter/otf/Inter-Bold.otf"),
});
if (!loaded) {
return null;
}
return (
<TamaguiProvider config={config}>
<Theme name={colorScheme === "dark" ? "dark" : "light"}>
<YStack
f={1}
jc='center'
ai="center"
backgroundColor={"$backgroundSoft"}>
<Paragraph color='$color' jc="center">
{colorScheme}
</Paragraph>
<StatusBar style="auto" />
</YStack>
</Theme>
</TamaguiProvider>
);
}
Run Code Online (Sandbox Code Playgroud)
所以,毕竟,我们可以使用缓存清除标志来运行 expo 并享受乐趣。
import { createInterFont } from '@tamagui/font-inter';
import { createMedia } from '@tamagui/react-native-media-driver';
import { shorthands } from '@tamagui/shorthands';
import { themes, tokens } from '@tamagui/theme-base';
import { createTamagui } from 'tamagui';
import { createAnimations } from '@tamagui/animations-react-native';
const animations = createAnimations({
bouncy: {
type: 'spring',
damping: 10,
mass: 0.9,
stiffness: 100,
},
lazy: {
type: 'spring',
damping: 20,
stiffness: 60,
},
quick: {
type: 'spring',
damping: 20,
mass: 1.2,
stiffness: 250,
}
});
const headingFont = createInterFont();
const bodyFont = createInterFont();
const config = createTamagui({
animations,
defaultTheme: 'dark',
shouldAddPrefersColorThemes: false,
themeClassNameOnRoot: false,
shorthands,
fonts: {
heading: headingFont,
body: bodyFont,
},
themes,
tokens,
media: createMedia({
xs: { maxWidth: 660 },
sm: { maxWidth: 800 },
md: { maxWidth: 1020 },
lg: { maxWidth: 1280 },
xl: { maxWidth: 1420 },
xxl: { maxWidth: 1600 },
gtXs: { minWidth: 660 + 1 },
gtSm: { minWidth: 800 + 1 },
gtMd: { minWidth: 1020 + 1 },
gtLg: { minWidth: 1280 + 1 },
short: { maxHeight: 820 },
tall: { minHeight: 820 },
hoverNone: { hover: 'none' },
pointerCoarse: { pointer: 'coarse' },
})
});
export type AppConfig = typeof config;
declare module 'tamagui' {
// overrides TamaguiCustomConfig so your custom types
// work everywhere you import `tamagui`
interface TamaguiCustomConfig extends AppConfig {}
}
export default config;
Run Code Online (Sandbox Code Playgroud)
我希望能帮助你。
| 归档时间: |
|
| 查看次数: |
3749 次 |
| 最近记录: |