отдельное базовое описание класса для фонового изображения

#image #flutter #dart #background

#изображение #flutter #dart #фон

Вопрос:

// Я хочу использовать фоновое изображение для каждой страницы в моем приложении Flutter. На данный момент я использую базовое описание // отдельного класса для настройки фонового изображения. Однако flutter не отражает // описанное фоновое изображение на устройстве. // Есть ли лучший способ отразить фоновое изображение?

 import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter_svg/flutter_svg.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter  ;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: CarouselSlider(
          options: CarouselOptions(height: 240.0),
          items: [1, 2, 3, 4, 5].map((i) {
            return Builder(
              builder: (BuildContext context) {
                return Container(
                    width: MediaQuery.of(context).size.width,
                    margin: EdgeInsets.symmetric(horizontal: 5.0),
                    decoration: BoxDecoration(color: Colors.amber),
                    child: Text(
                      'text $i',
                      style: TextStyle(fontSize: 16.0),
                    ));
              },
            );
          }).toList(),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class  BaseLayout extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return DecoratedBox(
      decoration: BoxDecoration(
        image: DecorationImage(
            image: AssetImage("assets/images/logo1.svg"), fit: BoxFit.cover),
      ),
      child: Center(child: FlutterLogo(size: 300)),
    );
  }
}````
  

Ответ №1:

Вы должны сделать свой фон каркаса прозрачным, если вы собираетесь использовать базовый макет в качестве родительского для всех ваших страниц. Вы можете использовать scaffoldBackgroundColor свойство Scaffold виджета, чтобы сделать его прозрачным.

Или лучше, вы можете определить его своими Theme данными при объявлении своих MaterialApp . Пример кода:

 class MyApp extends StatelessWidget {
// This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
     title: 'Flutter Demo',
     theme: ThemeData(
       scaffoldBackgroundColor: Colors.transparent, // To Make scaffold background Transparent
       appBarTheme: AppBarTheme(color:Colors.transparent // To Make appbar background transparent.
       primarySwatch: Colors.blue,
       visualDensity: VisualDensity.adaptivePlatformDensity,
    ),
    home: MyHomePage(title: 'Flutter Demo Home Page'),
  );
 }
}
  

Затем в вашем BaseLayout классе:

 class  BaseLayout extends StatelessWidget {
  const BaseLayout({this.child});
  final Widget child;
  @override
  Widget build(BuildContext context) {
    return DecoratedBox(
      decoration: BoxDecoration(
        image: DecorationImage(
            image: AssetImage("assets/images/logo1.svg"), fit: BoxFit.cover),
      ),
      child: Center(child: child),
    );
  }
}
  

Теперь вы можете обернуть любой Scaffold виджет вашего приложения этим BaseLayout классом, который вы только что создали, и его фоновое изображение будет одинаковым во всем приложении.