Stack Overflow em Português Asked by Pedro Vinicius on December 14, 2020
Não estou conseguindo adicionar um SVG em um componente (SplashScreen
), segue o código:
import {LinearGradient} from 'expo-linear-gradient'
import React from 'react';
import {Text, View, Image} from "react-native";
import Estilos from './styles'
export default function (){
return(
<LinearGradient style={Estilos.gradiente} colors={['#0095FF', '#0048FF']}>
<View style={Estilos.rectangle}>
<Image source={require('./Vector 5.svg')}/>
<Text style={Estilos.text}>otation</Text>
</View>
</LinearGradient>
);
};
Segue o código da estilização:
import {StyleSheet} from "react-native";
export default StyleSheet.create({
gradiente:{
flex : 1,
justifyContent : 'center',
alignItems: 'center'
},
text: {
fontStyle: 'normal',
fontWeight: 'bold',
fontSize: 40,
backgroundColor : 'white',
borderRadius : 20
},
rectangle: {
position: 'absolute',
justifyContent : 'center',
width: 266,
height: 100,
backgroundColor: 'white',
borderRadius: 20
}
});
Garanto que estou estou referenciando todos os arquivos corretamente. Alguma ideia do que pode estar errado?
Pastas do projeto:
A screenshot do app:
Para fazer uso de SVG em React Native você precisará de uma biblioteca que te ajude com isso.
Como está usando Expo, dê uma olhada nessa documentação do react-native-svg
e também na biblioteca react-native-svg-transformer
que permitirá a importação de SVGs.
Leia as documentações citadas para ver as orientações de instalação em versões mais antigas do React Native e do Expo, além de como configurar para utilização no Jest.
Instale as duas bibliotecas, sendo a react-native-svg-transformer
como dependência de desenvolvimento:
expo install react-native-svg
yarn add -D react-native-svg-transformer // ou npm install -D react-native-svg-transformer
yarn add react-native-svg // ou npm install react-native-svg
yarn add -D react-native-svg-transformer // ou npm install -D react-native-svg-transformer
Para configurar o react-native-svg-transformer
, unifique seu metro.config.js
existente com o abaixo. Caso não possua um arquivo metro.config.js
, crie-o.
const { getDefaultConfig } = require("metro-config");
module.exports = (async () => {
const {
resolver: { sourceExts, assetExts }
} = await getDefaultConfig();
return {
transformer: {
babelTransformerPath: require.resolve("react-native-svg-transformer")
},
resolver: {
assetExts: assetExts.filter(ext => ext !== "svg"),
sourceExts: [...sourceExts, "svg"]
}
};
})();
Para quem usa Expo, além do passo anterior, é preciso adicionar o seguinte no app.json
:
{
"expo": {
"packagerOpts": {
"config": "metro.config.js",
"sourceExts": [
"expo.ts",
"expo.tsx",
"expo.js",
"expo.jsx",
"ts",
"tsx",
"js",
"jsx",
"json",
"wasm",
"svg"
]
}
}
}
Caso esteja a utilizar TypeScript, adicione a seguinte tipagem no arquivo declarations.d.ts
:
declare module "*.svg" {
import React from 'react';
import { SvgProps } from "react-native-svg";
const content: React.FC<SvgProps>;
export default content;
}
Agora é possível utilizar um SVG como sendo um componente React:
import MySvg from './my.svg';
export const Screen = () => {
return <MySvg width="100" height="100" />
}
Ao testar um componente que renderiza um SVG, será necessário configurar um mock para o Jest. Não tenho certeza se este passo também é necessário caso esteja usando o Expo.
__mocks__/svgMock.js
:module.exports = "SvgMock";
module.exports.ReactComponent = "SvgMock";
package.json
ou jest.config.js
):moduleNameMapper: {
"\.svg": "<rootDir>/__mocks__/svgMock.js"
}
Correct answer by Rafael Tavares on December 14, 2020
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP